好用的 Rust crate:err_code,简化服务错误码生成

428 阅读3分钟

推荐

在 Rust 开发中,错误处理是个绕不开的话题。如果你在找一个简单又好用的工具来管理错误码,可以试一下 err_code 这个 crate 。它通过一个宏就能为枚举添加数值型错误码,还能自动生成 error_code 方法。让错误处理变得更轻松、更高效。

目录

GitHub 仓库

快速上手

err_code很简单,在 Cargo.toml 文件里加上这一行:

[dependencies]
err_code = "=0.1.0"

加完之后,就可以在代码里引入并开始使用了。

基本用法

err_code 的用法特别直截了当。只需要三步:

  1. Cargo.toml 中加入依赖(上面已经提到了)。
  2. 在你的错误枚举上加 #[derive(ErrorCode)]
  3. #[error_code(value)] 给每个枚举变体指定一个错误码。

默认情况下,错误码是 u32 类型,

示例:基本用法

来看个简单的例子:

use err_code::ErrorCode;

#[derive(ErrorCode, Debug)]
enum MyError {
    #[error_code(100)]
    InvalidInput,
    #[error_code(200)]
    NotFound,
}

在这段代码里:

  • MyError::InvalidInput 的错误码是 100
  • MyError::NotFound 的错误码是 200

想获取错误码?直接调用 error_code 方法就行:

let error = MyError::InvalidInput;
println!("错误码: {}", error.error_code()); // 输出: 100

进阶用法

除了基础功能,err_code 还支持一些高级玩法,能满足更复杂的需求。

自定义错误码类型

默认错误码是 u32,但你可以用 type 属性改成别的无符号整数类型,比如 u8u16u64。可以根据你的需要,从而平衡性能与业务需求。

  • 用法#[error_code(type = "u16")]
  • 默认:不写的话就是 u32

设置默认错误码

不想每个变体都手动指定错误码?可以用 default 属性给没写错误码的变体设个默认值。

  • 用法#[error_code(default = 300)]

示例:进阶用法

下面这个例子展示了 typedefault 的用法:

use err_code::ErrorCode;

#[derive(ErrorCode, Debug)]
#[error_code(type = "u16", default = 300)]
enum MyError {
    #[error_code(100)]
    InvalidInput,
    NotFound, // 用默认错误码
}

这里:

  • 错误码类型改成了 u16
  • MyError::InvalidInput 的错误码是 100
  • MyError::NotFound 没写错误码,就用默认值 300

调用方式一样:

let error1 = MyError::InvalidInput;
println!("错误码: {}", error1.error_code()); // 输出: 100

let error2 = MyError::NotFound;
println!("错误码: {}", error2.error_code()); // 输出: 300

注意

  • 不写 type,默认是 u32

thiserror 搭配

err_codethiserror 可以无缝配合。你既能用 thiserror 生成详细的错误消息,又能用 err_code 添加数值型错误码。

示例:结合 thiserror

看看这个例子:

use err_code::ErrorCode;
use thiserror::Error;
use std::io::Error as IoError;

#[derive(Error, ErrorCode, Debug)]
#[error_code(type = "u16", default = 300)]
enum MyError {
    #[error("输入有误: {0}")]
    #[error_code(100)]
    InvalidInput(String),

    #[error("没找到资源: {name}")]
    #[error_code(200)]
    NotFound { name: String },

    #[error(transparent)]
    IoError(#[from] IoError), // 用默认错误码
}

这里:

  • thiserror 提供了错误消息。
  • err_code 加上了错误码。
  • IoError 没指定错误码,就用默认值 300

用起来是这样的:

let error = MyError::InvalidInput("test".to_string());
println!("错误: {}", error);          // 输出: "输入有误: test"
println!("错误码: {}", error.error_code()); // 输出: "100"

let io_error = IoError::new(std::io::ErrorKind::Other, "IO 出错了");
let error = MyError::IoError(io_error);
println!("错误: {}", error);          // 输出: "IO 出错了"
println!("错误码: {}", error.error_code()); // 输出: "300"

推荐理由

  • err_codethiserror 各司其职,互不干扰。
  • 可以单独用一个,也可以两个都用,完全看需求。

总结

err_code 是个小而美的 Rust crate,专为错误码管理设计。它的用法简单,功能灵活,不管是基本场景还是复杂需求都能驾驭。能让错误处理更上一层楼。