【问题标题】:Handling panics of external libraries处理外部库的恐慌
【发布时间】:2021-07-23 11:48:05
【问题描述】:

我是 Rust 新手,并且开始了解 Rust 默认为恐慌而不是异常。

我有一个依赖于外部库的 rust 项目。

我已经使用match 语句在我的代码中处理了所有展开和?,但我不确定如何通过外部库处理panic。

在其他语言中,我只会捕获库抛出的异常。

由于 Rust 默认为恐慌,库不返回异常,而是返回 panic,从而中止线程的执行。

理想情况下,我希望记录并继续执行,而不是恐慌和中止。

我尝试了以下方法:

  • catch_unwind,但这看起来我不能在外部库上使用。
  • log-panics crate,它使用恐慌钩子记录恐慌。我可以记录恐慌,但不能防止中止。

【问题讨论】:

    标签: error-handling rust rust-cargo panic


    【解决方案1】:

    不要惊慌

    我的意思是,这才是真正的解决方案:您必须避免恐慌,而不是在恐慌发生时试图从中恢复。

    有些语言随意使用异常来处理阻止某些操作的条件,并在不崩溃的情况下管理它们。 在 Rust 中,那些不受支持的条件是通过错误而不是恐慌来管理的。

    Rust 中的恐慌是

    • 通常是一个错误,通常是暂时的,因为您在第一个原型设计中放置了 unwrap
    • 或非常异常情况

    当一个板条箱你使用恐慌时,首先检查你是否按预期使用了函数(如果你不能在没有恐慌的情况下检查那是那个库中的一个错误),然后要么修复它,要么自己修复它,如果你可以。

    除了尽可能快地崩溃之外,没有合理的方法来处理偶然的​​恐慌。在您的程序生命周期中,恐慌并非偶然。

    【讨论】:

    • 对不起,我一直想用友好的大字写“不要惊慌”。
    • 我是否可以建议强调一下,如果一个库无法在不恐慌的情况下处理(或检查)某种情况,那是该库的 API 设计中的一个错误?
    • @KevinReid 试图把它放在答案中。
    猜你喜欢
    • 2015-03-29
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    相关资源
    最近更新 更多