如何正确处理Rust中maxminddb::geoip2的AddressNotFound错误?
我有一小段代码需要修复,但对生锈知之甚少 当我执行以下操作时,某些ip值会失败如何正确处理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));
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),
};