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)。

相关推荐
vipbic30 分钟前
别再把“做个H5”挂嘴边了:这个词,官方压根就没有定义过
前端
红尘散仙1 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
ZC跨境爬虫2 小时前
跟着 MDN 学CSS day_39:(Flexbox 弹性盒子核心机制)
前端·css·ui·html·tensorflow
小陈同学呦2 小时前
前端如何处理订单状态导航的数据竞态问题
前端·javascript
喵个咪3 小时前
GoWind Toolkit 前端代码生成|Vue3(ElementPlus/Vben)、React(AntDesign)全自动一键生成教程
前端·vue.js·react.js
摆烂大大王4 小时前
玩转 OpenClaw:用 TaskFlow + Heartbeat 打造自动化工作流
前端·人工智能·自动化
zhangxingchao4 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
梦想的颜色4 小时前
TypeScript 完全指南(上):从零开始掌握类型系统
前端·typescript
之歆4 小时前
Day01_ES6+ 专业指南:从基础到实战的现代JavaScript开发(下)
前端·javascript·es6
lichenyang4535 小时前
鸿蒙 MVVM 实战:从 Demo 到工程化,聊聊登录、状态管理与埋点系统设计
前端