Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确处理Rust中maxminddb::geoip2的AddressNotFound错误?_Rust - Fatal编程技术网

如何正确处理Rust中maxminddb::geoip2的AddressNotFound错误?

如何正确处理Rust中maxminddb::geoip2的AddressNotFound错误?,rust,Rust,我有一小段代码需要修复,但对生锈知之甚少 当我执行以下操作时,某些ip值会失败 let city: geoip2::City = georeader.lookup(ip).unwrap(); let c_name = city.city .and_then(|cy| cy.names) .and_then(|n| n.get("en") .map(String::from));

我有一小段代码需要修复,但对生锈知之甚少

当我执行以下操作时,某些ip值会失败

let city: geoip2::City = georeader.lookup(ip).unwrap();
let c_name = city.city
                .and_then(|cy| cy.names)
                .and_then(|n| n.get("en")
                .map(String::from));

let loc = city.location.unwrap();
let lat = loc.latitude.unwrap();
let lon = loc.longitude.unwrap();
它失败,出现AddressNotFound异常

我尝试使用返回一个默认值

let city: geoip2::City = georeader.lookup(ip).unwrap_or_else(|err| geoip2::City::default(););
它既不起作用,也不能完全解决我的问题

最后,我想抓住AddressNotFound和set

let c_name = "unknown"
let loc = None
let lat = ""
let lon = ""
并在可用时使用实际值

let c_name = city.city
                .and_then(|cy| cy.names)
                .and_then(|n| n.get("en")
                .map(String::from));
let loc = city.location.unwrap();
...
当城市可用时

我只是不知道怎么在生锈的地方做这样的事。有谁能给我举个简单的例子,或者帮我处理那个特殊的案例吗

已更新

我接受了评论并尝试了以下方法:

let city: std::result::Result<Option<geoip2::City>, maxminddb::MaxMindDBError> = georeader.lookup(ip);
let (c_name, lat, lon) = match city {
  Ok(Some(city)) => (
    city.city.and_then(|cy| cy.names)
             .and_then(|n| n.get("en")
             .map(String::from)),
    city.location.unwrap().latitude.unwrap(),
    city.location.unwrap().longitude.unwrap()
   ),
   _ => (Some("unknown".to_owned()), 0.0_f64, 0.0_f64),
 };

也许你可以这样做,虽然我是从我的脑袋里打出来的,所以希望它不会马上起作用

let (c_name, loc, lat, lon) = match city.city {
  Ok(Some(names)) => (
    names.get("en").to_string(), 
    city.location, 
    <something>, 
    <something>,
  ),
  _ => ("unknown", None, "", ""),
}

也许这里的例子可以帮助你弄清楚该怎么做。如果你在阅读后还有其他问题,请告诉我。我用你的建议更新了我的问题,但我仍然遗漏了一些东西。更新了答案@ThatChrisGuy
let (c_name, loc, lat, lon) = match city.city {
  Ok(Some(names)) => (
    names.get("en").to_string(), 
    city.location, 
    <something>, 
    <something>,
  ),
  _ => ("unknown", None, "", ""),
}
let city: std::result::Result<Option<geoip2::City>, maxminddb::MaxMindDBError> = georeader.lookup(ip);
let (c_name, lat, lon) = match city {
  Ok(Some(city)) => (
    city.city.and_then(|cy| cy.names)
             .and_then(|n| n.get("en")
             .map(String::from)),
    city.location.as_ref().unwrap().latitude.unwrap(),
    city.location.as_ref().unwrap().longitude.unwrap()
   ),
   _ => (Some("unknown".to_owned()), 0.0_f64, 0.0_f64),
 };