在Axum Rust中,錯誤處理主要依賴于Result
類型和自定義錯誤類型。以下是一些關于如何在Axum Rust中進行錯誤處理的指南:
Result
類型:Axum Rust中的函數通常返回一個Result<T, E>
類型的值,其中T
是成功的返回類型,E
是錯誤的返回類型。當函數成功執行時,返回Ok(T)
;當函數遇到錯誤時,返回Err(E)
。
例如,假設我們有一個簡單的HTTP處理函數,它從請求中讀取一個字符串并將其轉換為大寫:
use axum::{extract::RequestExt, Response, Server};
use std::convert::Infallible;
async fn to_uppercase(req: Request<String>) -> Result<Response<String>, Infallible> {
let input = req.extract().expect("Failed to extract string from request");
Ok(Response::new(input.to_uppercase()))
}
在這個例子中,我們使用Result<Response<String>, Infallible>
作為返回類型。如果從請求中提取字符串成功,我們返回Ok(Response::new(input.to_uppercase()))
;如果提取失敗,我們返回Err(Infallible)
,因為Infallible
是一個永遠不會失敗的錯誤類型。
在某些情況下,你可能需要創建自定義錯誤類型來表示特定于你的應用程序的錯誤。你可以使用thiserror
庫來輕松創建自定義錯誤類型。
首先,添加thiserror
庫到你的Cargo.toml
文件中:
[dependencies]
thiserror = "1.0"
然后,創建一個自定義錯誤類型:
use thiserror::Error;
#[derive(Error, Debug)]
pub enum MyError {
#[error("Invalid input: {0}")]
InvalidInput(String),
#[error("Internal server error: {0}")]
InternalServerError(String),
}
現在,你可以在你的Axum處理函數中使用這個自定義錯誤類型:
use axum::{extract::RequestExt, Response, Server};
use std::convert::Infallible;
use MyError::*;
async fn to_uppercase(req: Request<String>) -> Result<Response<String>, MyError> {
let input = req.extract().expect("Failed to extract string from request");
if input.is_empty() {
return Err(InvalidInput(input));
}
Ok(Response::new(input.to_uppercase()))
}
在這個例子中,我們將返回類型更改為Result<Response<String>, MyError>
,并在遇到錯誤時使用自定義錯誤類型MyError
。