You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:42:03