#error #try #ergonomic

try-catch

一个简单的进程宏,它为Rust提供了自动错误类型降级的try-catch功能

4个版本

0.2.2 2021年8月21日
0.2.1 2021年8月21日
0.2.0 2021年8月21日
0.1.0 2021年8月21日

#5#ergonomic

Download history 272/week @ 2024-03-12 271/week @ 2024-03-19 661/week @ 2024-03-26 310/week @ 2024-04-02 195/week @ 2024-04-09 305/week @ 2024-04-16 233/week @ 2024-04-23 224/week @ 2024-04-30 222/week @ 2024-05-07 242/week @ 2024-05-14 229/week @ 2024-05-21 229/week @ 2024-05-28 209/week @ 2024-06-04 205/week @ 2024-06-11 353/week @ 2024-06-18 190/week @ 2024-06-25

1,012 每月下载量
200 个crate中使用 (3 直接)

Apache-2.0

9KB
140

此crate提供了一个宏,它使其他编程语言的熟悉try-catch语法可用。它可以用来轻松地按类型而不是值分组错误,并动态地管理它们。

use try_catch::catch;
use std::*;
use serde_json::Value;

catch! {
    try {
        let number: i32 = "10".parse()?;
        let data = fs::read_to_string("data.json")?;
        let json: Value = serde_json::from_str(&data)?;
    }
    catch error: io::Error {
        println!("Failed to open the file: {}", error)
    }
    catch json_err: serde_json::Error {
        println!("Failed to serialize data: {}", json_err)
    }
    catch err {
        println!("Error of unknown type: {}", err)
    }
};

注意,如果没有通配符,编译器将警告未使用的返回值。它也可以用作表达式

// We can guarantee that all errors are catched
// so the type of this expression is `i32`.
// It can be guarantieed because the final catch
// does not specify an Error type.
let number: i32 = catch! {
    try {
        let number: i32 = "10".parse()?;
        number
    } catch error {
        0
    }
};
// we can't know for sure if all possible errors are
// handled so the type is still Result.
let result: Result<i32, _> = catch! {
    try {
        let number: i32 = "10".parse()?;
        number
    } catch error: io::Error {
        0
    }
};

依赖项

~1.5MB
~35K SLoC