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

打印 上一主题 下一主题

主题 910|帖子 910|积分 2730

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

Web Service 中的统一错误处理

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


  • 数据库

    • 数据库错误

  • 串行化

    • serde 错误

  • I/O 操作

    • I/O 错误

  • Actix-Web 库

    • Actix 错误

  • 用户非法输入

    • 用户非法输入错误

Actix-Web 的错误处理


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

    • 异常
    • 返回值( Rust 使用这种)

  • Rust 希望开发者显式的处理错误,因此,可能出错的函数返回Result 枚举类型,其定义如下:
  1. enum Result<T, E> {
  2.   Ok(T),
  3.         Err(E),
  4. }
复制代码
例子
  1. use std::num::ParseIntError;
  2. fn main() {
  3.   let result = square("25");
  4.   println!("{:?}", result);
  5. }
  6. fn square(val: &str) -> Result<i32, ParseIntError> {
  7.   match val.parse::<i32>() {
  8.     Ok(num) => Ok(num.pow(2)),
  9.     Err(e) => Err(3),
  10.   }
  11. }
复制代码
? 运算符


  • 在某函数中使用 ? 运算符,该运算符尝试从 Result 中获取值:

    • 如果不成功,它就会接收 Error ,中止函数执行,并把错误传播到调用该函数的函数。

  1. use std::num::ParseIntError;
  2. fn main() {
  3.   let result = square("25");
  4.   println!("{:?}", result);
  5. }
  6. fn square(val: &str) -> Result<i32, ParseIntError> {
  7.   let num = val.parse::<i32>()?;
  8.   Ok(num ^ 2)
  9. }
复制代码
自定义错误类型


  • 创建一个自定义错误类型,它可以是多种错误类型的抽象。
  • 例如:
  1. #[derive(Debug)]
  2. pub enum MyError {
  3.   ParseError,
  4.         IOError,
  5. }
复制代码
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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表