• [2023.09.18]: Rust中类型转换在错误处理中的应用解析


    随着项目的进展,关于Rust的故事又翻开了新的一页,今天来到了服务器端的开发场景,发现错误处理中的错误类型转换有必要分享一下。
    Rust抽象出来了Result,T是返回值的类型,E是错误类型。只要函数的返回值的类型被定义为Resut,那么作为开发人员就有责任来处理调用这个函数可能发生的错误。通过Result,Rust其实给开发人员指明了一条错误处理的道路,使代码更加健壮。

    场景

    1. 服务器端处理api请求的框架:Rocket
    2. 服务器端处理数据持久化的框架:tokio_postgres

    在api请求的框架中,我把返回类型定义成了Result>,即错误类型是rocket::response::status::Custom\
    在tokio_postgres中,直接使用tokio_postgres::error::Error

    即如果要处理错误,就必须将tokio_postgres::error::Error转换成rocket::response::status::Custom\。那么我们从下面的原理开始,逐一领略Rust的错误处理方式,通过对比找到最合适的方式吧。

    原理

    对错误的处理,Rust有3种可选的方式

    1. 使用match
    2. 使用if let
    3. 使用map_err

    下面我结合场景,逐一演示各种方式是如何处理错误的。
    下面的代码中涉及到2个模块(文件)。/src/routes/notes.rs是路由层,负责将api请求导向合适的service。/src/services/note_books.rs是service层,负责业务逻辑和数据持久化的处理。这里的逻辑也很简单,就是route层调用service层,将数据写入到数据库中。

    使用match

    src/routes/notes.rs

    #[post("/api/notes", format = "application/json", data = "")]
    pub async fn post_notes(note: Json<Note>) -> Result<(), rocket::response::status::Custom<String>> {
       
        insert_or_update_note(&note.into_inner()).await
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    /src/services/note_book.rs

    pub async fn insert_or_update_note(
        note: &Note,
    ) -> Result<(), rocket::response::status::Custom<String>> {
       
        let (client, connection) = match connect(
            "host=localhost dbname=notes_db user=postgres port=5432",
            NoTls,
        )
        .await
        {
       
            Ok(res) => res,
            Err(err) => {
       
                return Err(rocket::response::status::Custom(
                    rocket::http::Status::ExpectationFailed,
                    format!("{}", err),
                ));
            }
        };
    
        ...
    
        match client
            .execute(
                "insert into notes (id, title, content) values($1, $2, $3);",
                &[&get_system_seconds(), &note.title, &note.content],
            
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    英文字母pc是什么意思,互联网的pc指的是什么
    Stable Diffusion Webui--安装与使用
    asp.net core之HttpClient
    22-06-25 西安 linux(02) 命令、shell脚本开发、linux安装软件
    Shell echo命令
    ggplot2 -- geom_linerange 函数的简单使用
    1、验证1101序列(Moore)
    【直扩通信】直扩通信系统信号捕获性能分析附matlab代码
    重绘和回流(重排)
    如何在Linux使用Docker部署Firefox并实现无公网IP访问本地浏览器
  • 原文地址:https://blog.csdn.net/firefox1/article/details/132982822