一、错误和异常

在所有语言中,对程序运行不按照设计的“套路”出牌,都是错误。异常可以理解成程序的错误引发了运行的故障,甚至导致程序崩溃。正因为如此,对错误和异常的处理是所有语言都必须拥有的一个行为,无论是从语法层面还是从运行检查层面,都是无法回避的。同样,Rust也不能例外。

二、Rust中对错误的处理

在前面分析Result和Option时,分析过返回值和错误的处理。在Rust中,没有异常这一说,但为了和其它语言的描述保持一致,这里也叫做了异常的处理。Rust语言中有可恢复错误(recoverable)和 不可恢复错误(unrecoverable)两种,其中前者就是Result等来控制;后者通过panic来处理,搞过Go的对这个关键字有点熟悉不?
有过调试经验的开发者都会知道,在程序出现问题时,首先需要进行栈回溯,定位出问题的具体位置。在Rust中,panic时默认是栈展开的,但也可以选择abort,即让整个程序终止。不过这样做有一个问题,可能相应的程序占用的资源处理可能无法进行。总之panic一出就无法挽回了,所以何时使用它,要心里有数。常见的主要场景有:
1、测试或者Demo,这种情况无所谓。
2、具体的情况明确,需要直接退出。比如一些具体的条件不具备,即使程序启动也没有意义。
3、致命错误。

除此之外,一些可明确的其它场景根据实际情况也可以使用。其它的就可以使用错误来处理,在错误处理中,可以类似c++Exception一样,把自己的错误处理丰富越来,自定义一些规则和说明,这样更容易为合作方接受,也为自己定位错误提供方便。

三、实例

看个例子:
1、Demo的情况:

//发散函数的例程
fn main() {println!("hello");diverging();println!("world");
}
fn diverging() -> ! {panic!("This function will never return");
}

2、越界异常检测

fn main() {let va = vec![1, 2, 3];va[66];
}

再看一个:

use std::cell::RefCell;
use std::thread;
let result = thread::spawn(move || {let c = RefCell::new(5);let m = c.borrow_mut();let b = c.borrow(); // this causes a panic
}).join();
assert!(result.is_err());

对不可恢复的错误处理,是一个比较微妙的问题,需要在实际情况中对此做出自己的符合实际场景的代码设计和实现。在上面的越界错误中,可以通过设置Rust的环境变量RUST_BACKTRACE 不为0,来得到栈的列表:

$ RUST_BACKTRACE=1 cargo runFinished dev [unoptimized + debuginfo] target(s) in 0.00sRunning `target/debug/panic`
thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 99', libcore/slice/mod.rs:2448:10
stack backtrace:0: std::sys::unix::backtrace::tracing::imp::unwind_backtraceat libstd/sys/unix/backtrace/tracing/gcc_s.rs:491: std::sys_common::backtrace::printat libstd/sys_common/backtrace.rs:71at libstd/sys_common/backtrace.rs:592: std::panicking::default_hook::{{closure}}at libstd/panicking.rs:2113: std::panicking::default_hookat libstd/panicking.rs:2274: <std::panicking::begin_panic::PanicPayload<A> as core::panic::BoxMeUp>::getat libstd/panicking.rs:4765: std::panicking::continue_panic_fmtat libstd/panicking.rs:3906: std::panicking::try::do_callat libstd/panicking.rs:3257: core::ptr::drop_in_placeat libcore/panicking.rs:778: core::ptr::drop_in_placeat libcore/panicking.rs:599: <usize as core::slice::SliceIndex<[T]>>::indexat libcore/slice/mod.rs:244810: core::slice::<impl core::ops::index::Index<I> for [T]>::indexat libcore/slice/mod.rs:231611: <alloc::vec::Vec<T> as core::ops::index::Index<I>>::indexat liballoc/vec.rs:165312: panic::mainat src/main.rs:413: std::rt::lang_start::{{closure}}at libstd/rt.rs:7414: std::panicking::try::do_callat libstd/rt.rs:59at libstd/panicking.rs:31015: macho_symbol_searchat libpanic_unwind/lib.rs:10216: std::alloc::default_alloc_error_hookat libstd/panicking.rs:289at libstd/panic.rs:392at libstd/rt.rs:5817: std::rt::lang_startat libstd/rt.rs:7418: panic::main
  • 上述代码来自《Rust程序设计语言》和《RustPrimer》

四、总结

Rust把错误和异常分开了,符合他们整体的风格。Rust有自己的优势,可这种优势不是说已经稳占上风了。昨天看报道说Rust的审核团队集体离职,动荡一起,Rust能不能够按照初心继续前进,就要打一个问号了。
不忘初心,不断努力,希望Rust亦是如此!

rust的错误和异常相关推荐

  1. 简单介绍Go语言错误处理异常捕获+异常抛出

    这篇文章主要介绍了Go语言错误处理异常捕获和异常抛出,Go语言的作者认为java等语言的错误处理底层实现较为复杂,就实现了函数可以返回错误类型以及简单的异常捕获,虽然简单但是也非常精妙,大大的提高了运 ...

  2. C#高级编程----错误和异常的总结

    错误和异常的总结 因为总结吗,,可能概念啥的比较多,大家要学着适应. 首先是C#中的异常用老处理系统级和用户级的错误状态,是一种结构化,统一的类型安全的处理机制. 因为鄙人开始想走C++的道路,所以搞 ...

  3. nginx php 错误日志,PHP 错误与异常的日志记录

    提到 Nginx + PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志.error 日志以及 PHP 的 error 日志.虽然看起来是个很简单的问题,但里面其实又牵扯到 ...

  4. python 错误与异常

    python 错误与异常 语法错误 异常:大多数的异常都不会被程序处理,都以错误信息的形式展现在这里 异常处理: while True:try:x = int(input("请输入一个错误: ...

  5. .NET WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)

    .NET WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作) 参考文章: (1).NET WebAPI 用ExceptionFilt ...

  6. python常见错误-Python错误及异常总结汇总

    程序员的一生中,错误几乎每天都在发生.在过去的一个时期, 错误要么对程序(可能还有机器)是致命的,要么产生一大堆无意义的输出,无法被其他计算机或程序识别,连程序员自己也可能搞不懂它的意义.一旦出现错误 ...

  7. python错误-新手常见Python错误及异常解决处理方案

    写Python代码的小伙伴不可避免地会遇到代码执行错误和异常,这次就来详细且不失通俗地总结一下python中的错误和异常. 先抛出两个问题: 什么是Python错误和异常? 如何处理Python错误和 ...

  8. python常见错误-新手常见Python错误及异常解决处理方案

    写Python代码的小伙伴不可避免地会遇到代码执行错误和异常,这次就来详细且不失通俗地总结一下python中的错误和异常. 先抛出两个问题: 什么是Python错误和异常? 如何处理Python错误和 ...

  9. python中语法错误-Python3 错误和异常

    Python3 错误和异常 作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python 有两种错误很容易辨认:语法错误 ...

最新文章

  1. mysql8.0.12密码_mysql8.0.12如何重置root密码
  2. 【论文理解】ArcFace: Additive Angular Margin Loss for Deep Face Recognition(InsightFace)
  3. 中国最大AI预训练模型发布:113亿参数!北京智源研究院、阿里、清华等联手打造
  4. 简析Instgram的搜索架构
  5. web developer tips (70):使用命令脚本安装IIS7
  6. 又一次Task.Wait引起的教训
  7. javascript 类的创建1
  8. 会展管理系统是计算机软件系统,展商管理系统|会展管理信息系统
  9. 围棋,与生活,与编程
  10. 如何快速提交网站备案 ICP备案
  11. RS232颜色的接线图
  12. 雷电模拟器一直android正在启动,雷电安卓模拟器启动后没反应、无法启动、闪退的3种解决办法-针对2020年4月4号出现的...
  13. 【转】聚类——GMM
  14. 低功耗计算机视觉技术前沿,四大方向,追求更小、更快、更高效
  15. PHP如何使用Ds\Deque clear()函数?用法示例
  16. Java Swing 键盘事件监听
  17. 第五章 定积分及其应用
  18. Android App开发动画特效中帧动画和电影淡入淡出动画的讲解及实战(附源码和演示视频 简单易懂)
  19. VMware运行虚拟机卡慢等解决办法
  20. dnw下载文件时can not open /dev/secbulk0的解决方法

热门文章

  1. Mac切换docker镜像源
  2. 汇编语言中xor指令_汇编各类指令用法及含义分析 - 全文
  3. Telink Mesh简单安卓app分析
  4. HTML学生个人网站作业设计——HTML+CSS+JavaScript优分期大学生分期购物商城(7页)
  5. 讲给后台程序员看的前端系列教程(06)——HTML5标签(5)
  6. Funcode-Q版泡泡堂
  7. 用python画小狗,用turtle画个单身狗送给自己~
  8. vue使用阿里字体教程(引入外部字体)
  9. 一文搞定 | Linux 网络子系统
  10. 2019-9-11-数据结构查找方法总结