如何在年报网站上做遗失公告,网站电脑端和手机端,外国人做僾视频网站,网站建设玖金手指排名15什么是panic
在Rust中#xff0c;有一类错误叫作panic。示例如下#xff1a; 编译#xff0c;没有错误#xff0c;执行这段程序#xff0c;输出为#xff1a; 这种情况就引发了一个panic。在这段代码中#xff0c;我们调用了Option::unwrap()方法#xff0c;正是这个方…什么是panic
在Rust中有一类错误叫作panic。示例如下 编译没有错误执行这段程序输出为 这种情况就引发了一个panic。在这段代码中我们调用了Option::unwrap()方法正是这个方法有可能导致panic。根据提示我们设置一个环境变量RUST_BACKTRACE1之后再执行这个程序可以看到这个程序在发生panic时候的函数调用栈。
Panic实现机制
在Rust中Panic的实现机制有两种方式unwind和abort。
unwind方式在发生panic的时候会一层一层地退出函数调用栈在此过程中当前栈内的局部变量还可以正常析构。abort方式在发生panic的时候会直接退出整个程序。
在常见的操作系统上默认情况下编译器使用的是unwind方式。所以在发生panic的时候我们可以通过一层层地调用栈找到发生panic的第一现场就像前面例子展示的那样。
但是unwind并不是在所有平台上都能获得良好支持的。在某些嵌入式系统上unwind根本无法实现或者占用的资源太多。在这种时候我们可以选择使用abort方式实现panic.
编译器提供了一个选项供用户指定panic的实现方式。
Panic Safety
C中引入了“异常”这个机制之后同时也带入了一个“异常安全”(exception safety)的概念。
异常安全存在四种层次的保证
No-throw——这种层次的安全性保证了所有的异常都在内部正确处理完毕外部毫无影响Strong exception safety——强异常安全保证可以保证异常发生的时候所有的状态都可以“回滚”到初始状态不会导致状态不一致的问题Basic exception safety——基本异常安全保证可以保证异常发生的时候不会导致资源泄漏No exception safety——没有任何异常安全保证。
在Rust中什么情况下panic会导致bug呢?这种情况的产生需要两个条件
panic导致了数据结构内部的状态错误这个错误的状态会在以后被观测到。
在unsafe代码中这种情况非常容易出现。所以在写unsafe代码的时候需要对这种情况非常敏感小心一不小心就可能因为这个原因制造出“内存不安全”。
在不用unsafe的情况下Panic Safety是基本有保障的。