我正在尝试将错误链与 websocket crate 一起使用,但遇到了一个我不确定如何解决的问题。 WsUpgrade::accept
具有以下签名:
fn accept(self) -> Result<Client<S>, (S, IoError)>
请注意,Err
变体是一个元组。我想配置错误链来处理对此方法的调用,所以我尝试在相关的消费模块中按如下方式进行:
mod errors {
error_chain! {
foreign_links {
WebSock((::std::net::TcpStream, ::std::io::Error));
}
}
}
这会导致以下错误,似乎与元组的存在有关。
error: expected identifier, found `(`
--> src/lib/websock.rs:23:21
|
23 | WebSock((::std::net::TcpStream, ::std::io::Error));
| ^
我该如何解决这个问题?希望我错过了一些简单的事情。
最佳答案
一个简单的解决方案是引入类型别名:
mod errors {
type WebSocketError = (::std::net::TcpStream, ::std::io::Error);
error_chain! {
foreign_links {
WebSock(WebSocketError);
}
}
}
但是,此类型未实现错误链所需的特征(例如 Error
和 Display
),因此不能在那里使用。
我认为最简单的解决方案是使用 Result::map_err
手动转换错误在将值传递给错误链之前。例如,以下构造将产生 Result<Client<S>, IoError>
:
x.accept().map_err(|e| e.1)
关于Rust 与错误链和 websocket crate 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43970529/