Rust Web 全栈开发之 Web Service 中的错误处理
Web Service 中的统一错误处理
Actix Web Service 自定义错误类型 -> 自定义错误转为 HTTP Response
- 数据库
- 串行化
- I/O 操作
- Actix-Web 库
- 用户非法输入
Actix-Web 的错误处理
- 编程语言常用的两种错误处理方式:
- Rust 希望开发者显式的处理错误,因此,可能出错的函数返回Result 枚举类型,其定义如下:
- enum Result<T, E> {
- Ok(T),
- Err(E),
- }
复制代码 例子- use std::num::ParseIntError;
- fn main() {
- let result = square("25");
- println!("{:?}", result);
- }
- fn square(val: &str) -> Result<i32, ParseIntError> {
- match val.parse::<i32>() {
- Ok(num) => Ok(num.pow(2)),
- Err(e) => Err(3),
- }
- }
复制代码 ? 运算符
- 在某函数中使用 ? 运算符,该运算符尝试从 Result 中获取值:
- 如果不成功,它就会接收 Error ,中止函数执行,并把错误传播到调用该函数的函数。
- use std::num::ParseIntError;
- fn main() {
- let result = square("25");
- println!("{:?}", result);
- }
- fn square(val: &str) -> Result<i32, ParseIntError> {
- let num = val.parse::<i32>()?;
- Ok(num ^ 2)
- }
复制代码 自定义错误类型
- 创建一个自定义错误类型,它可以是多种错误类型的抽象。
- 例如:
- #[derive(Debug)]
- pub enum MyError {
- ParseError,
- IOError,
- }
复制代码 Actix-Web 把错误转化为 HTTP Response
- Actix-Web 定义了一个通用的错误类型( struct ):actix_web::error::Error
- 它实现了 std::error::Error 这个 trait
- 任何实现了标准库 Error trait 的类型,都可以通过 ? 运算符,转化为 Actix 的 Error 类型
- Actix 的 Error 类型会自动的转化为 HTTP Response ,返回给客户端。
- ResponseError trait :任何实现该 trait 的错误均可转化为HTTP Response 消息。
- 内置的实现: Actix-Web 对于常见错误有内置的实现,例如:
- Rust 标准 I/O 错误
- Serde 错误
- Web 错误,例如: ProtocolError 、 Utf8Error 、 ParseError 等等
- 其它错误类型:内置实现不可用时,需要自定义实现错误到 HTTP Response 的转换
创建自定义错误处理器
- 创建一个自定义错误类型
- 实现 From trait ,用于把其它错误类型转化为该类型
- 为自定义错误类型实现 ResponseError trait
- 在 handler 里返回自定义错误类型
- Actix 会把错误转化为 HTTP 响应
项目目录
[code]ws on main [✘!?] via
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |