# Rust Web 全棧開發之 Web Service 中的錯誤處理 ## Web Service 中的統一錯誤處理 ### Actix Web Service 自定義錯誤類型 -> 自定義錯誤轉為 HTTP Response - 資料庫 - 資料庫錯誤 - 串列化 - serde 錯誤 - I/ ...
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)
}
自定義錯誤類型
- 創建一個自定義錯誤類型,它可以是多種錯誤類型的抽象。
- 例如:
#[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 響應
項目目錄
ws on main [✘!?] via