羊蹓狼 发表于 2023-5-31 10:44:00

Rust Web 全栈开发之 Web Service 中的错误处理

Rust Web 全栈开发之 Web Service 中的错误处理

Web Service 中的统一错误处理

Actix Web Service 自定义错误类型    ->    自定义错误转为 HTTP Response


[*]数据库

[*]数据库错误

[*]串行化

[*]serde 错误

[*]I/O 操作

[*]I/O 错误

[*]Actix-Web 库

[*]Actix 错误

[*]用户非法输入

[*]用户非法输入错误

Actix-Web 的错误处理


[*]编程语言常用的两种错误处理方式:

[*]异常
[*]返回值( Rust 使用这种)

[*]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)
}自定义错误类型


[*]创建一个自定义错误类型,它可以是多种错误类型的抽象。
[*]例如:
#
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 响应
项目目录
ws on  main [✘!?] via
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Rust Web 全栈开发之 Web Service 中的错误处理