Merge pull request #477 from AllanDowney/patch-2

fix(errors): dead link
pull/479/head
Sunface 3 years ago committed by GitHub
commit 79434972b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -48,11 +48,11 @@
- [动态数组Vector](basic/collections/vector.md) - [动态数组Vector](basic/collections/vector.md)
- [KV存储HashMap](basic/collections/hashmap.md) - [KV存储HashMap](basic/collections/hashmap.md)
- [类型转换](basic/converse.md) - [类型转换](basic/converse.md)
- [返回值和异常](basic/result-error/intro.md) - [返回值和错误处理](basic/result-error/intro.md)
- [panic深入剖析!](basic/result-error/panic.md) - [panic深入剖析!](basic/result-error/panic.md)
- [返回值Result和?](basic/result-error/result.md) - [返回值Result和?](basic/result-error/result.md)
- [包和模块](basic/crate-module/intro.md) - [包和模块](basic/crate-module/intro.md)
- [crate](basic/crate-module/crate.md) - [Crate](basic/crate-module/crate.md)
- [模块Module](basic/crate-module/module.md) - [模块Module](basic/crate-module/module.md)
- [使用use引入模块及受限可见性](basic/crate-module/use.md) - [使用use引入模块及受限可见性](basic/crate-module/use.md)
- [注释和文档](basic/comment.md) - [注释和文档](basic/comment.md)
@ -64,8 +64,8 @@
- [&'static 和 T: 'static](advance/lifetime/static.md) - [&'static 和 T: 'static](advance/lifetime/static.md)
<!-- - [一些关于生命周期的误解 todo](advance/lifetime/misconceptions.md) --> <!-- - [一些关于生命周期的误解 todo](advance/lifetime/misconceptions.md) -->
- [函数式编程: 闭包、迭代器](advance/functional-programing/intro.md) - [函数式编程: 闭包、迭代器](advance/functional-programing/intro.md)
- [闭包closure](advance/functional-programing/closure.md) - [闭包Closure](advance/functional-programing/closure.md)
- [迭代器iterator](advance/functional-programing/iterator.md) - [迭代器Iterator](advance/functional-programing/iterator.md)
- [深入类型](advance/into-types/intro.md) - [深入类型](advance/into-types/intro.md)
- [newtype 和 类型别名](advance/into-types/custom-type.md) - [newtype 和 类型别名](advance/into-types/custom-type.md)
- [Sized 和不定长类型 DST](advance/into-types/sized.md) - [Sized 和不定长类型 DST](advance/into-types/sized.md)
@ -253,3 +253,4 @@
- [H-Rust更新版本列表](appendix/rust-versions/intro.md) - [H-Rust更新版本列表](appendix/rust-versions/intro.md)
- [1.58](appendix/rust-versions/1.58.md) - [1.58](appendix/rust-versions/1.58.md)
- [1.59](appendix/rust-versions/1.59.md) - [1.59](appendix/rust-versions/1.59.md)

@ -1,5 +1,5 @@
# 错误处理 # 错误处理
在之前的[返回值和错误章节](https://course.rs/basic/result-error/intro.html)中,我们学习了几个重要的概念,例如 `Result` 用于返回结果处理,`?` 用于错误的传播,若大家对此还较为模糊,强烈建议回头温习下。 在之前的[返回值和错误处理](https://course.rs/basic/result-error/intro.html)章节中,我们学习了几个重要的概念,例如 `Result` 用于返回结果处理,`?` 用于错误的传播,若大家对此还较为模糊,强烈建议回头温习下。
在本章节中一起来看看如何对 `Result` ( `Option` ) 做进一步的处理,以及如何定义自己的错误类型。 在本章节中一起来看看如何对 `Result` ( `Option` ) 做进一步的处理,以及如何定义自己的错误类型。
@ -515,7 +515,7 @@ fn render() -> Result<String, Box<dyn Error>> {
} }
``` ```
这个方法很简单,在绝大多数场景中,性能也非常够用,但是有一个问题:`Result` 实际上不会限制错误的类型,也就是一个类型就算不实现 `Error` 特征,它依然可以在 `Result<T,E>` 中作为 `E` 来使用,此时这种特征对象的解决方案就无能为力了。 这个方法很简单,在绝大多数场景中,性能也非常够用,但是有一个问题:`Result` 实际上不会限制错误的类型,也就是一个类型就算不实现 `Error` 特征,它依然可以在 `Result<T, E>` 中作为 `E` 来使用,此时这种特征对象的解决方案就无能为力了。
#### 自定义错误类型 #### 自定义错误类型
与特征对象相比,自定义错误类型麻烦归麻烦,但是它非常灵活,因此也不具有上面的类似限制: 与特征对象相比,自定义错误类型麻烦归麻烦,但是它非常灵活,因此也不具有上面的类似限制:

@ -1,12 +1,12 @@
# 返回和错误处理 # 返回和错误处理
飞鸽传书、八百里加急,自古以来,掌权者最需要的就是及时获得对某个事物的信息反馈,在此过程中,也定义了相应的应急处理措施。 飞鸽传书、八百里加急,自古以来,掌权者最需要的就是及时获得对某个事物的信息反馈,在此过程中,也定义了相应的应急处理措施。
社会演变至今,这种思想依然没变,甚至来到计算中的微观世界,也是如此。及时、准确的获知系统在发生什么,是程序设计的重中之重。因此能够准确的分辨函数返回值是正确的还是错误的、以及在发生错误时该怎么快速处理,成了程序设计语言的必备功能。 社会演变至今,这种思想依然没变,甚至来到计算中的微观世界,也是如此。及时、准确的获知系统在发生什么,是程序设计的重中之重。因此能够准确的分辨函数返回值是正确的还是错误的、以及在发生错误时该怎么快速处理,成了程序设计语言的必备功能。
Go 语言为人诟病的其中一点就是 ***if err != nil {}*** 的大量使用,缺乏一些程序设计的美感,不过我倒是觉得这种简单的方式也有其好处,就是阅读代码时的流畅感很强,你不需要过多的思考各种语法是什么意思。与 Go 语言不同Rust 博采众家之长,实现了颇具自身色彩的返回值和错误处理体系,本章我们就高屋建瓴地来学习,更加深入的讲解见[此章](../../advance/errors/intro.md). Go 语言为人诟病的其中一点就是 ***if err != nil {}*** 的大量使用,缺乏一些程序设计的美感,不过我倒是觉得这种简单的方式也有其好处,就是阅读代码时的流畅感很强,你不需要过多的思考各种语法是什么意思。与 Go 语言不同Rust 博采众家之长,实现了颇具自身色彩的返回值和错误处理体系,本章我们就高屋建瓴地来学习,更加深入的讲解见[错误处理](https://course.rs/advance/errors.html)。
## Rust的错误哲学 ## Rust 的错误哲学
错误对于软件来说是不可避免的因此一门优秀的编程语言必须有其完整的错误处理哲学。在很多情况下Rust 需要你承认自己的代码可能会出错,并提前采取行动,来处理这些错误。 错误对于软件来说是不可避免的因此一门优秀的编程语言必须有其完整的错误处理哲学。在很多情况下Rust 需要你承认自己的代码可能会出错,并提前采取行动,来处理这些错误。
Rust 中的错误主要分为两类: Rust 中的错误主要分为两类:

Loading…
Cancel
Save