Skip to content

常见错误处理

自定义错误类型

rust
use axum::{
    response::{IntoResponse, Response},
    http::StatusCode,
    Json,
};
use serde_json::json;

#[derive(Debug)]
enum AppError {
    NotFound(String),
    BadRequest(String),
    Internal(String),
    DatabaseError(sqlx::Error),
}

impl IntoResponse for AppError {
    fn into_response(self) -> Response {
        match self {
            AppError::NotFound(msg) => {
                (StatusCode::NOT_FOUND, Json(json!({"error": msg}))).into_response()
            }
            AppError::BadRequest(msg) => {
                (StatusCode::BAD_REQUEST, Json(json!({"error": msg}))).into_response()
            }
            AppError::Internal(msg) => {
                (StatusCode::INTERNAL_SERVER_ERROR, Json(json!({"error": msg}))).into_response()
            }
            AppError::DatabaseError(err) => {
                (StatusCode::INTERNAL_SERVER_ERROR, Json(json!({"error": err.to_string()}))).into_response()
            }
        }
    }
}

impl From<sqlx::Error> for AppError {
    fn from(err: sqlx::Error) -> Self {
        AppError::DatabaseError(err)
    }
}
▶ Run

练习

练习 1:用户认证 API

实现一个用户认证系统:

  • 注册(用户名 + 密码)
  • 登录(返回 JWT)
  • 获取当前用户信息

练习 2:文件上传服务

创建一个文件上传 API:

  • 支持 multipart/form-data
  • 保存上传的文件
  • 提供文件下载接口

练习 3:分页列表 API

实现带分页的列表接口:

  • ?page=1&limit=10
  • 返回总数和分页信息

小结

本章我们学习了:

  • ✅ Axum 基础用法
  • ✅ 路由和提取器
  • ✅ 响应处理
  • ✅ REST API 实现
  • ✅ 中间件
  • ✅ 静态文件服务
  • ✅ Actix-web 示例
  • ✅ 数据库集成

Web 框架选择

需求推荐框架
新项目Axum
高性能Actix-web
易用性Rocket
微服务Warp

第 28 章:测试与文档