处理外部库的恐慌

Abh*_*hna 1 error-handling panic rust rust-cargo

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

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

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

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

由于 Rust 默认为 panics,库不会返回异常,但会panic中止线程的执行。

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

我尝试了以下方法:

  • catch_unwind,但这看起来像我不能在外部库上使用的东西。
  • log-panicscrate,它使用恐慌钩子记录恐慌。我能够记录恐慌,但不能防止中止。

Den*_*ret 8

不要惊慌

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

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

Rust 中的恐慌是

  • 最常见的错误,通常是暂时的,因为你已经unwrap在你的第一个原型中加入了
  • 非常特殊的情况

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

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

  • 抱歉,我一直想用友好的大信写下“不要惊慌”。 (7认同)
  • 我是否可以建议强调一下,如果一个库无法提供处理(或检查)情况而不引起恐慌的方法,那么这是该库的 API 设计中的一个错误? (4认同)
  • 这是一个没有答案的问题。就我而言,web_sys 或 wasm_bindgen_futures 中的某些内容令人恐慌,我无法重写这些库,而且这种恐慌很难重现,因此几乎不可能为这些团队提供一份像样的报告。如果我能简单地捕捉到恐慌,我认为它可以被忽略,而不是现在有一个有毒的互斥体需要处理。 (2认同)