2个稳定版本

1.0.1 2021年11月27日
1.0.0 2020年6月10日

#637 in 调试

MIT 许可证

10KB

describe_err

想知道这个错误是从哪里来的吗?

在寻找哪些多个I/O错误破坏了你的日常吗?

现在你可以在每个错误中添加简短的描述,并确保你知道发生了什么。如果你不想自己发明,好吧,你只需从代码中生成它们即可!

示例

假设你想在指定的路径上创建文件,并在这里写入给定的字符串。让我们暂时忘记 std::fs::write 存在,并且我们自己来做

fn create_and_write(path: &Path, content: &str) -> Result<(), io::Error> {
    let file = File::create(path)?;
    write!(file, "{}", content)?;
    file.sync_all()
}

这里有三种不同的错误来源,并且不一定总是很明显在特定情况下哪个是真正的错误。这就是 describe_err 处理的方式

use describe_err::{describing, Described};

fn create_and_write(path: &Path, content: &str) -> Result<(), Described<io::Error>> {
    let file = describing!(File::create(path))?;
    write!(file, "{}", content).map_err(describe("Cannot write to file"))?;
    describing!(file.sync_all())
}

这里你可以看到两种使用库的方法

  • 通过显式提供 describe 的描述。这个函数返回一个闭包,该闭包将传入的错误映射到 Described 实例。
  • 通过将产生 Result 的操作包装在 describing! 宏中,该宏将错误描述为字符串化内容。

我们可以用这个包装器做什么?

和你对任何其他错误所做的任何事一样。

Described 通过连接提供的描述和原始错误的 Display 输出(由冒号分隔)来实现 Display。它还实现了 Error,其中 Error::cause 指向原始错误。因此,你可以轻松地将其与,例如,thiserror 结合使用——顺便说一句,这是 Described 本身所依赖的。

许可证

MIT (c) Cerberuser

依赖项

~285–750KB
~18K SLoC