#error #语法错误 #早期 #语法 #try #返回

无 std tear

类型化早期返回和循环控制 + 类似 try! 的错误处理语法糖

7 个版本 (4 个重大更改)

0.5.1 2021年4月11日
0.5.0 2021年4月11日
0.4.0 2020年8月3日
0.3.0 2020年5月27日
0.1.1 2020年5月19日

#5 in #早期

每月 37 次下载
switchable 中使用

MIT/Apache

66KB
533

tear

类型化早期返回和循环控制 + 类似 try! 的错误处理语法糖

与 Rust v1.34+ 兼容(2019年4月11日发布)

概要

将宏导入您的模块

use tear::prelude::*;

使用 terror! 的显式错误处理语法

let handled = terror! { can_error() => print_error };
let variant = terror! { can_io_error() => CustomError::Io };

// Equivalent using `?`:
let handled = can_error().map_err(print_error)?;
let variant = can_io_error.map_err(CustomError::Io)?;

使用 twist! 早期循环继续

for re in regexes_strings {
    // Skip iteration if the regex fails to compile
    let re = twist! { Regex::new(re) => |_| next!() }

    // Use regex...

使用 tear_if! 关键字样式的早期返回

fn divide_i32 (num: i32, denom: i32) -> Option<f32> {
    // Return early if dividing by 0
    tear_if! { denom == 0, None };

    // Compute quotient...

使用 tear! 类型化早期返回

// Tells the calling function to return early on failure
fn get_value_or_return() -> ValRet<String, i32> { Ret(-1) }

fn status_code() -> i32 {
    let v = tear! { get_value_or_return() };

    // Process value...

有关更多信息,请参阅文档

变更日志

请参阅变更日志

原因

我想使早期返回更明确。

通常,您需要读取到 if 体末尾才能知道是否返回。 tear_if 将该信息放置在块的开始处。

我想有类型化的早期返回,因为这对于向上传递退出码很有用。

类型化的早期返回允许您有可以强制其调用者早期返回的函数。这是受 Raku 中的 Slips 启发的远程操作。

我想有注释的失败点,而不是太多的组合器。

操作符 ? 实际上是一个条件早期返回。要将错误转换为正确的类型,您需要使用组合器。我发现很难辨别这些组合器是用于错误处理的。

类似于这样的

let path = find_config_file().ok_or(Error::FindPathF)?
let mut file = get_file_buffer(&path).map_err(Error::GetFileF)?;

terror! 宏使错误处理更明确

let path = terror! { find_config_file() => Error::FindPathF };
let mut file = terror! { get_file_buffer(&path) => Error::GetFileF };

循环控制和早期返回类似

我已经实现了类型化的早期返回,为什么不实现类型化的循环控制呢?它们同样有用。

另请参阅

许可

根据您的选择,许可协议可以是Apache License, Version 2.0MIT许可证

除非您明确表示,否则您根据Apache-2.0许可证定义的,有意提交以包含在本软件包中的任何贡献,将按照上述方式双许可,没有任何附加条款或条件。

依赖项