如何检测Warp的try_bind_with_graceful_shutdown返回错误是否为AddrInUse类型
校验Warp框架端口占用错误的实现方法
try_bind_with_graceful_shutdown方法返回的错误类型为Warp框架定义的warp::Error,该类型封装了底层的IO错误,你可以通过类型向下转换提取标准库IO错误后,再判断错误类型即可,具体操作如下:
- 捕获
try_bind_with_graceful_shutdown返回的Err分支,拿到warp::Error实例 - 调用
warp::Error的downcast_ref::<std::io::Error>()方法,尝试转换为标准IO错误的引用 - 转换成功后调用IO错误的
kind()方法,与std::io::ErrorKind::AddrInUse枚举值做等值判断
完整代码示例
use std::io::ErrorKind; use warp::Filter; #[tokio::main] async fn main() { // 示例路由 let routes = warp::any().map(|| "Hello World"); // 调用带优雅关机的绑定方法 let bind_result = warp::serve(routes) .try_bind_with_graceful_shutdown(([127, 0, 0, 1], 8080), async { // 优雅关机触发逻辑,示例为监听Ctrl+C信号 tokio::signal::ctrl_c().await.ok(); }); match bind_result { Ok((addr, server_fut)) => { println!("服务启动成功,监听地址: {}", addr); server_fut.await; } Err(e) => { // 校验是否为端口占用错误 if let Some(io_err) = e.downcast_ref::<std::io::Error>() { if io_err.kind() == ErrorKind::AddrInUse { println!("错误:当前端口已被占用,请更换端口后重试"); // 此处可添加端口占用场景的自定义处理逻辑 return; } } // 其他类型错误的通用处理 eprintln!("服务绑定失败:{}", e); } } }
注意:Warp的
Error类型原生实现了std::error::Error特征,所以可以直接使用downcast_ref系列方法做类型转换,不需要额外引入其他特征。
内容的提问来源于stack exchange,提问作者Lightstorm
相关产品推荐
相关产品推荐

