页面简洁的网站,天津西青区租房,微信专业开发,广告设计图片 海报鉴于上一篇文章过长#xff0c;不方便大家阅读和理解#xff0c;因此关于Rust中的错误处理#xff0c; 我将分以下3篇来讲。 另外#xff0c;随着我们学习的不断深入#xff0c;难度也会越来越大#xff0c;但不用担心。接下来只需要让自己的脚步慢一些#xff0c;认真搞… 鉴于上一篇文章过长不方便大家阅读和理解因此关于Rust中的错误处理 我将分以下3篇来讲。 另外随着我们学习的不断深入难度也会越来越大但不用担心。接下来只需要让自己的脚步慢一些认真搞懂每一篇文章的知识点把示例代码也在自己电脑上敲一敲相信大家终会有所收获因为时间是最好的见证人。角角与诸君共勉 1. 分享几个关于VS Code的使用小技巧 在正式讲解之前角角想分享一下关于 VS Code 的几个使用小技巧也是我最近了解到并开始使用的如果你已经知道了可以直接略过哈~ 看上面这张截图界面和字体是不是你喜欢的风格呢反正角角直接爱了~ 首先是左侧文件树每个文件夹的图标颜色都比较鲜艳也容易区分图标设计的也非常好看这是安装了一个叫Material Icon Theme 的插件在拓展商店中输入 icon第一个结果就是啦 第二个分享的插件是Houston这个插件可以让你的代码变得五彩斑斓和上面的文件夹图标是不是很搭呢它最有意思的功能是在工作区出现一个方块脸的悬浮窗当你写的代码没有错误时它会显示一个笑脸相反则是一个哭脸是不是很有意思 如果你启用了这个扩展但是并没有出现方块脸那你就需要在 资源管理器 中单击 HOUSTON 这个文件夹展开它之后方块脸就在左下方出现啦 要是你不喜欢这种花里胡哨只追求实用性那么我推荐你使用 One Dark Pro 这个主题颜色看起来非常的舒适很多大佬也都用这个。对了这个和上面的方块表情是可以同时使用的哦~ 第三个是快捷键我每次写一行代码的时候中间输入完了然后又要用鼠标点到末尾加个分号真的很烦哎 然后我就网上查了一下果然有解决的办法就是键盘上的 End 键然后 End 键上面的就是 Home 键。当你的光标在一行代码中间位置时按一下 End 键就可以快速跳转到该行代码的末尾然后再随手敲一个分号和回车是不是棒极了 Home 键与之相反按一下则会跳转到该行代码的开始位置用的不多。 如果是笔记本的话就按组合键Fn EndFn Home 。 最后一个组合快捷键是Shift Alt 下方向键这个的作用就是将光标所在的那一行代码再复制到下一行这个用的场景还是比较多的大家可以记一下。 后面角角再发现一些小技巧会不定时分享在文章中的真心希望能帮助到大家如果你们也有一些好用的小技巧也不妨分享在评论区哈~ 2. 不可恢复错误与panic! Rust提供了一个特殊的 panic! 宏。程序会在 panic! 宏执行时打印出一段错误提示信息展开并清理当前的调用栈然后退出程序。这种情况大部分都发生在某个错误被检测到但程序员却不知该如何处理的时候。 当 panic宏执行会有以下3个动作 你的程序会打印一个错误信息 展开unwind、清理调用栈Stack 退出程序 在默认情况下当 panic 发生有以下两种情况 程序展开调用栈工作量大Rust沿着调用栈往回走清理每个遇到的函数中的数据 立即中止调用栈不进行清理直接停止程序内容让操作系统OS去处理 如果你想让二进制文件exe文件更小可以把设置从“展开”改为“中止”。设置方法就是在 Cargo.toml 文件中适当的 profile 部分设置即添加panic abort 。 下面简单敲一行代码试试这个 panic宏
fn main() {panic!(我是练习时长两年半的角角);
} 输出结果如下
thread main panicked at src\main.rs:2:5:
我是练习时长两年半的角角
note: run with RUST_BACKTRACE1 environment variable to display a backtrace
error: process didnt exit successfully: target\debug\error.exe (exit code: 101) 好多英文看不懂翻译一下
线程“main”在src\main处惊慌失措。rs:2:5:
我是练习时长两年半的角角
注意使用“RUST_BACKTRACE1”环境变量运行以显示回溯
错误进程未成功退出target\debug\error.exe退出代码101 结果第一行中的 src\main.rs:2:5 表示恐慌发生在 src\main.rs 文件中的第二行第五个字符处。而指向的这个地方正是我们调用 panic宏的地方。 一般情况下panic宏是和其它一些代码结合使用的并不会单单像我们这样就只敲一行代码。我们可以通过查看 panic! 调用函数的回溯信息来定位代码出现问题的地方。 这里引出一个新的概念回溯信息。 3. 使用panic! 产生的回溯信息 先举个我先创建一个动态数组然后里面放3个元素但我会用索引访问其中的第10个元素。
fn main() {let v vec![1, 2, 3];v[9];
} 像这种越界访问编译器就没有提前检测出错误 但会导致 panic。 在类似于C这样的语言中程序在这种情况下依然会尝试返回你所请求的值即便这可能会与你所期望的并不相符你会得到动态数组中对应这个索引位置的内存而这个内存可能存储了其他数据甚至都不属于动态数组本身。 这种情形也被称为缓冲区溢出buffer overread并可能导致严重的安全性问题。攻击者可以通过操纵索引来访问存储在数组后面的、那些不被允许读取的数据。 我们运行一下上面的例子看看报错内容
thread main panicked at src\main.rs:3:6:
index out of bounds: the len is 3 but the index is 9
note: run with RUST_BACKTRACE1 environment variable to display a backtrace
error: process didnt exit successfully: target\debug\error.exe (exit code: 101) 翻译一下
线程“main”在src\main处惊慌失措。rs:3:6:
索引越界len为3但索引为9
注意使用“RUST_BACKTRACE1”环境变量运行以显示回溯
错误进程未成功退出target\debug\error.exe退出代码101 第一行是告诉我们错误的位置第二行是错误的原因第三行提示我们可以通过设置环境变量 RUST_BACKTRACE 来得到回溯信息进而确定触发错误的原因。回溯中包含了到达错误点的所有调用函数列表。 在Rust中使用回溯的方式与在其他语言中的使用方式类似从头开始查看回溯列表直至定位到自己所编写代码的文件而这也正是产生问题的地方。 从定位到文件的那一行往上是我们代码所调用的代码往下则是调用了我们代码的代码。这些调用中可能会包含Rust核心库、标准库以及你所使用的第三方库。 让我们来将环境变量 RUST_BACKTRACE 设置为一个 非0值从而获得回溯信息。在Windows操作系统下的 PowerShell 窗口中分别输入
$env:RUST_BACKTRACEfull
cargo run 得到的回溯信息如下
thread main panicked at src\main.rs:3:6:
index out of bounds: the len is 3 but the index is 9
stack backtrace:0: 0x7ff7207872ea - std::sys_common::backtrace::_print::impl$0::fmtat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\sys_common\backtrace.rs:441: 0x7ff72079508b - core::fmt::rt::Argument::fmtat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\core\src\fmt\rt.rs:1382: 0x7ff72079508b - core::fmt::writeat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\core\src\fmt\mod.rs:11143: 0x7ff7207856b1 - std::io::Write::write_fmtstd::sys::windows::stdio::Stderrat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\io\mod.rs:17634: 0x7ff72078706a - std::sys_common::backtrace::_printat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\sys_common\backtrace.rs:475: 0x7ff72078706a - std::sys_common::backtrace::printat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\sys_common\backtrace.rs:346: 0x7ff72078905a - std::panicking::default_hook::closure$1at /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\panicking.rs:2727: 0x7ff720788cc8 - std::panicking::default_hookat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\panicking.rs:2928: 0x7ff720789708 - std::panicking::rust_panic_with_hookat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\panicking.rs:7319: 0x7ff7207895ed - std::panicking::begin_panic_handler::closure$0at /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\panicking.rs:60910: 0x7ff720787cd9 - std::sys_common::backtrace::__rust_end_short_backtracestd::panicking::begin_panic_handler::closure_env$0,never$at /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\sys_common\backtrace.rs:17011: 0x7ff720789300 - std::panicking::begin_panic_handlerat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\panicking.rs:59712: 0x7ff720799eb7 - core::panicking::panic_fmtat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\core\src\panicking.rs:7213: 0x7ff72079a044 - core::panicking::panic_bounds_checkat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\core\src\panicking.rs:18014: 0x7ff7207812bd - core::slice::index::impl$2::indexi32at /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1\library\core\src\slice\index.rs:26115: 0x7ff720781076 - alloc::vec::impl$12::indexi32,usize,alloc::alloc::Globalat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1\library\alloc\src\vec\mod.rs:272816: 0x7ff720781a96 - error::mainat C:\Users\45570\Desktop\rust_demo\error\src\main.rs:317: 0x7ff7207818bb - core::ops::function::FnOnce::call_oncevoid (*)(),tuple$ at /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1\library\core\src\ops\function.rs:25018: 0x7ff7207817be - std::sys_common::backtrace::__rust_begin_short_backtracevoid (*)(),tuple$ at /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1\library\std\src\sys_common\backtrace.rs:15419: 0x7ff7207817be - std::sys_common::backtrace::__rust_begin_short_backtracevoid (*)(),tuple$ at /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1\library\std\src\sys_common\backtrace.rs:15420: 0x7ff720781831 - std::rt::lang_start::closure$0tuple$ at /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1\library\std\src\rt.rs:16621: 0x7ff720783ba8 - std::rt::lang_start_internal::closure$2at /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\rt.rs:14822: 0x7ff720783ba8 - std::panicking::try::do_callat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\panicking.rs:50423: 0x7ff720783ba8 - std::panicking::tryat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\panicking.rs:46824: 0x7ff720783ba8 - std::panic::catch_unwindat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\panic.rs:14225: 0x7ff720783ba8 - std::rt::lang_start_internalat /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1/library\std\src\rt.rs:14826: 0x7ff72078180a - std::rt::lang_starttuple$ at /rustc/a28077b28a02b92985b3a3faecf92813155f1ea1\library\std\src\rt.rs:16527: 0x7ff720781af9 - main28: 0x7ff720798940 - invoke_mainat D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:7829: 0x7ff720798940 - __scrt_common_main_sehat D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:28830: 0x7fff42d0257d - BaseThreadInitThunk31: 0x7fff44f4aa58 - RtlUserThreadStart
error: process didnt exit successfully: target\debug\error.exe (exit code: 101) 在回溯信息的第16行它指出了程序的主要错误在 main.rs 文件的第3行。在这个 error::main 的上方就是我们调用的代码而下方则是调用我们所写代码的代码。 若你想关闭回溯可以使用如下命令
$env:RUST_BACKTRACE0 如果将来代码发生了 panic你就需要自己去搞清楚代码中的哪些操作或哪些值导致了 panic并且思考应该如何修改代码以避免出现问题。 下篇文章将介绍可恢复错误与Result角角期待你的订阅与关注咱们下篇见