Error handling 如何处理铁锈上的装箱和连锁错误?

Error handling 如何处理铁锈上的装箱和连锁错误?,error-handling,rust,hyper,reqwest,Error Handling,Rust,Hyper,Reqwest,我有很多代理uri(http和socks5),我使用reqwest通过这些代理发送一些http请求,如果他不工作,我想删除一个代理 代理中的代理的{ 让proxy=match proxy::all(proxy\u url){ 确定(代理)=>代理, 错误(e)=>{ eprintln!(“创建代理失败!{:?}”,e); 继续; } }; 让client=匹配client::builder() .代理(proxy) .build() 让客户端=匹配客户端{ Ok(客户端)=>客户端, 错误(e)

我有很多代理uri(http和socks5),我使用reqwest通过这些代理发送一些http请求,如果他不工作,我想删除一个代理

代理中的代理的
{
让proxy=match proxy::all(proxy\u url){
确定(代理)=>代理,
错误(e)=>{
eprintln!(“创建代理失败!{:?}”,e);
继续;
}
};
让client=匹配client::builder()
.代理(proxy)
.build()
让客户端=匹配客户端{
Ok(客户端)=>客户端,
错误(e)=>{
eprintln!(“构建客户端失败!{:?}”,e);
继续;
}
}
环路{
匹配client.get(&config.endpoint).send().wait{
Ok()=>{}
错误(e)=>{
如果e.is\u proxy\u error(){//此方法不存在
eprintln!(“删除代理…”);
打破
}否则{
eprintln!(“客户端错误!{:?}”,e);
}
}
}
}
}
我得到了很多种
Reqwest::Error

reqwest::Error { kind: Request, url: "http://example.com/", source: hyper::Error(Connect, "socks connect error: Invalid response version") }
reqwest::Error { kind: Request, url: "http://example.com/", source: hyper::Error(Connect, "socks connect error: Proxy server unreachable") }
reqwest::Error { kind: Request, url: "http://example.com/", source: hyper::Error(Connect, "socks connect error: Connection refused") }
reqwest::Error { kind: Request, url: "http://example.com/", source: hyper::Error(Connect, "socks connect error: Connection reset by peer (os error 104)") }
在大多数情况下,错误消息是明确的,但是我如何以不同的方式处理它们呢?
reqwest::Error
具有
内部
字段,该字段是私有的,因此我无法访问他。

如果我得到
reqwest::Error
的源代码,我就有一个
,我不能把它当作
hyper::Error

你可以把
Error::source()
的结果下推到一个具体的错误类型,例如

reqwest::Error { kind: Request, url: "http://example.com/", source: hyper::Error(Connect, "socks connect error: Invalid response version") }
reqwest::Error { kind: Request, url: "http://example.com/", source: hyper::Error(Connect, "socks connect error: Proxy server unreachable") }
reqwest::Error { kind: Request, url: "http://example.com/", source: hyper::Error(Connect, "socks connect error: Connection refused") }
reqwest::Error { kind: Request, url: "http://example.com/", source: hyper::Error(Connect, "socks connect error: Connection reset by peer (os error 104)") }
use std::error::Error;

...

    Err(reqwest_error) => {
        let hyper_error: Option<&hyper::Error> = reqwest_error
            .source()
            .unwrap()
            .downcast_ref();
        ...
    }