推荐
在 Rust 开发中,错误处理是个绕不开的话题。如果你在找一个简单又好用的工具来管理错误码,可以试一下 err_code 这个 crate 。它通过一个宏就能为枚举添加数值型错误码,还能自动生成 error_code 方法。让错误处理变得更轻松、更高效。
目录
GitHub 仓库
快速上手
用 err_code很简单,在 Cargo.toml 文件里加上这一行:
[dependencies]
err_code = "=0.1.0"
加完之后,就可以在代码里引入并开始使用了。
基本用法
err_code 的用法特别直截了当。只需要三步:
- 在
Cargo.toml中加入依赖(上面已经提到了)。 - 在你的错误枚举上加
#[derive(ErrorCode)]。 - 用
#[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 属性改成别的无符号整数类型,比如 u8、u16 或 u64。可以根据你的需要,从而平衡性能与业务需求。
- 用法:
#[error_code(type = "u16")] - 默认:不写的话就是
u32。
设置默认错误码
不想每个变体都手动指定错误码?可以用 default 属性给没写错误码的变体设个默认值。
- 用法:
#[error_code(default = 300)]
示例:进阶用法
下面这个例子展示了 type 和 default 的用法:
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_code 跟 thiserror 可以无缝配合。你既能用 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_code和thiserror各司其职,互不干扰。- 可以单独用一个,也可以两个都用,完全看需求。
总结
err_code 是个小而美的 Rust crate,专为错误码管理设计。它的用法简单,功能灵活,不管是基本场景还是复杂需求都能驾驭。能让错误处理更上一层楼。