29_不可恢复错误与panic

1. 概述

Rust的可靠性:错误处理,在大部分情况下,编译时提示错误,并处理。

Rust错误的分类如下:

  • 可恢复:例如文件未找到,可在此尝试
  • 不可恢复:bug的另外所说法,通常是逻辑错误,比如访问的索引超出范围

2. Rust的错误处理

Rust没有类似异常的机制,针对可恢复的错误,使用 Result<T, E>,针对不可恢复的错误,Rust提供了panic!宏,当执行panic!宏时,程序会执行以下逻辑

  • 打印一个错误信息
  • 展开(unwind)、清理调用栈(Stack)
  • 退出程序

为了应对panic,展开或终止(abort)调用栈,两种过程有以下区别

程序展开调用栈(工作量大):Rust沿着调用栈往回走,清理每个遇到的函数中的数据;立即终止调用栈:不进行清理,直接停止程序,内存需要OS进行清理。如果想让二进制文件更小,可以把设置从"展开"改为"终止"。修改步骤如下:

  • cargo.toml中适当的profile部分设置panic='abort',如下示例代码
Rust 复制代码
[package]
name = "s27_string_cut"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

[profile.release]
panic = 'abort'

3. 使用panic!产生的回溯信息

panic!可能出现在我们写的代码中,也可能出现在我们依赖的代码中。通过调用panic!的函数回溯信息来定位引起问题的代码。具体的做法是设置环境变量RUST_BACKTRACE=full可得到回溯信息。为了获取带有调试信息的回溯,必须启用调试符号(不带 --release)。

相关推荐
2022.11.7始学前端3 小时前
n8n第四节 表单触发器:让问卷提交自动触发企微消息推送
java·前端·数据库·n8n
m0_740043733 小时前
Axios 请求示例 res.data.data
前端·javascript·vue.js
程序员小寒3 小时前
超详细的 EventLoop 解读及模拟实现
前端·javascript
冴羽3 小时前
太好看了!3 个动漫变真人 Nano Banana Pro 提示词
前端·人工智能·aigc
zReadonly3 小时前
关于vxeTable转换树状表格以及问题思考
前端
锈儿海老师3 小时前
深入探究 React 史上最大安全漏洞
前端·react.js·next.js
一壶纱4 小时前
uni-app 使用 uview-plus
前端
敲敲了个代码4 小时前
从零实现一个「就地编辑」组件:深入理解 OOP 封装与复用的艺术
前端·javascript·学习·面试·前端框架
xiechao4 小时前
函数组件 useEffect 清理函数抛错:ErrorBoundary 能捕获吗?
前端·react.js
南游4 小时前
数组判断?我早不用instanceof了,现在一行代码搞定!
前端·javascript