处理外部库的恐慌
Handling panics of external libraries
我是 Rust 的新手,并且已经了解 Rust 默认情况下是恐慌而不是异常。
我有一个依赖外部库的 Rust 项目。
我已经使用 match
语句在我的代码中处理了所有解包和 ?
,但我不确定如何通过外部库处理 panic
。
在其他语言中,我只会捕获库抛出的异常。
由于 Rust 默认为恐慌,库不会 return 异常而是 panic
并因此中止线程的执行。
理想情况下,我希望记录并继续执行,而不是恐慌和中止。
我试过以下方法:
catch_unwind
,但这看起来像是我不能在外部库上使用的东西。
log-panics
crate,它使用 panic hook 记录 panic。我能够记录恐慌,但不能防止中止。
不要恐慌
我的意思是,这才是真正的解决方案:您必须避免恐慌,而不是在恐慌发生时试图从中恢复。
一些语言随意使用异常来处理阻止某些操作的条件,并在不崩溃的情况下管理它们。
在 Rust 中,那些不受支持的条件是通过错误而不是恐慌来管理的。
Rust 中的恐慌是
- 最常见的是错误,通常是暂时的,因为您在第一个原型制作中放置了
unwrap
- 或非常异常情况
正如the Book所说:
When code panics, there’s no way to recover
像 catch_unwind
这样的各种实用程序充其量只是为了更优雅地退出,它们不会让您的程序 运行 好像什么都没发生过一样。
当你使用 panics 的 crate 时,首先检查你是否按预期使用该函数(如果你无法检查而不恐慌那是该库中的错误),然后修复它或自己修复它如果可以的话。
除了尽快崩溃之外,没有合理的方法来处理偶然的恐慌。恐慌在您的程序生命周期中并非偶然。
我是 Rust 的新手,并且已经了解 Rust 默认情况下是恐慌而不是异常。
我有一个依赖外部库的 Rust 项目。
我已经使用 match
语句在我的代码中处理了所有解包和 ?
,但我不确定如何通过外部库处理 panic
。
在其他语言中,我只会捕获库抛出的异常。
由于 Rust 默认为恐慌,库不会 return 异常而是 panic
并因此中止线程的执行。
理想情况下,我希望记录并继续执行,而不是恐慌和中止。
我试过以下方法:
catch_unwind
,但这看起来像是我不能在外部库上使用的东西。log-panics
crate,它使用 panic hook 记录 panic。我能够记录恐慌,但不能防止中止。
不要恐慌
我的意思是,这才是真正的解决方案:您必须避免恐慌,而不是在恐慌发生时试图从中恢复。
一些语言随意使用异常来处理阻止某些操作的条件,并在不崩溃的情况下管理它们。 在 Rust 中,那些不受支持的条件是通过错误而不是恐慌来管理的。
Rust 中的恐慌是
- 最常见的是错误,通常是暂时的,因为您在第一个原型制作中放置了
unwrap
- 或非常异常情况
正如the Book所说:
When code panics, there’s no way to recover
像 catch_unwind
这样的各种实用程序充其量只是为了更优雅地退出,它们不会让您的程序 运行 好像什么都没发生过一样。
当你使用 panics 的 crate 时,首先检查你是否按预期使用该函数(如果你无法检查而不恐慌那是该库中的错误),然后修复它或自己修复它如果可以的话。
除了尽快崩溃之外,没有合理的方法来处理偶然的恐慌。恐慌在您的程序生命周期中并非偶然。