坏蛋Dan
知乎@坏蛋Dan
发布时间:2024.1.3

前言

昨天我们学了可恢复错误以及错误传递相关的内容

坏蛋Dan:rust基础学习--day19

今天继续往下学


啥时候该panic

正常情况下你都不会想要你的程序直接崩溃,毕竟你的代码是跑在线上的,如果崩溃就意味着可能将无法访问。所以正常情况下推荐是使用return Result的场景。

但是,如果你觉得这个地方就是需要用panic,那就尽情的用~

除了你觉得必须要panic的场景,实际上你在写库写组件或者写测试代码的时候,你就应该是使用panic而不是return Result,因为这些场景就是很需要暴露出问题点。

组件这玩意儿越早暴露出问题越好,要啥都测不出来等上了线就炸了(测试出来挨打.jpg)。

小栗子

虽然我们推荐是优先用返回Result这种方式,但是这种方式比起panic来说代码量会多些,结构也没有使用panic那么简洁。

所以,如果你能确定有些场景一定不会有Err,但是又需要有错误来兜底(绕过compiler的警告)。那么你就可以使用panic相关的方法。我们来看下例子

一个字面量的parseIpAddr的类型,这肯定是不会有错的(当然,你导错库另说~)。

这种时候你完全可以用expect或者unwrap来执行兜底,这样compiler就不会报错。同时你的代码就很简洁。


错误处理的指导方针

如果你的代码可能处于bad state也就是损坏的状态时,最好就用panic,啥叫损坏状态呢?

假设assumption、保证guarantee、约定contract和不可变性invariant这些被打破时就是损坏状态。

比如:

场景1:

你定义了一个function,而这个function需要传入参数,这就是一个约定。

但你的约定对方不屑遵守,不给你传,就要你写一段兼容没参数的场景。

这个时候你肯定很不爽,凭什么要我去兼容你这个无参数的场景。

所以,这个时候你写个panic,直接让他无路可走。这样就得劲了~

那么反过来

场景2:

我老老实实遵守了你的约定,我把参数传进去了,但是你返回的数据不对啊!

我找你理论,你不理我。

那没办法了,我只有panic,然后直接提交代码,然后等测试提bug直接分配给你~

场景3:

我早就知道你返回一个乱七八糟的数据了,就知道你小子信不过,我自己写了个方法,如果你的代码跑不通我就return Result,然后用我自己的方法。

场景4:

诶?卧槽。。。为什么我自己写的方法也有问题???

噢,原来是数据有问题,后端的家伙都不验证数据的正确性的。。。。

我还得写一个验证数据的逻辑,有问题我直接给你panic,都懒得和后端那家伙battle了。


创建一个自定义类型用于验证

上面的场景还是挺常见的,尤其是场景4,你对接的后端老哥,很有可能是个摸鱼大佬,压根没测试过数据。。。

所以针对这个情况,我们有必要在这里学一下如何验证数据,然后给它panic掉。你的锅我不背!

先来看个例子

这个相信大家都很熟悉,这个是day2里实现的猜数小游戏,而我们针对parse做了一层expect的保护,这里验证了一个数据的有效性。

而后我们又用了if对数据做了第二层验证。

如果后面还有场景,那么可能我们又得再验证一次,这样代码就存在着一些重复性的逻辑,就很不优雅。正常情况下我们应该验证一次就好了,我们来改下我们的代码

我们创建了一个struct构造体,实现了一个关联函数new和一个methodvalue,这个value我们一般叫做getter,返回私有的数据。

为什么要这么写呢?

有两点好处

  1. 数据私有化
  2. 如果没有通过数据验证(<100 && > 1),是不会产生实例的,会直接panic,后面如果还有其他验证逻辑,就都可以放到这个new关联函数里。

这么做就优雅很多。


总结

今天都是一些建议,实际开发还是看你自己~

最后,如果你觉得这篇文章对你有帮助的话请务必点个赞,谢谢~

参考

  1. ^rust-to-panic-or-not-to-panic https://doc.rust-lang.org/book/ch09-03-to-panic-or-not-to-panic.html#to-panic-or-not-to-panic
  2. ^rust-case-in-panic https://doc.rust-lang.org/book/ch09-03-to-panic-or-not-to-panic.html#cases-in-which-you-have-more-information-than-the-compiler
  3. ^error-handling-guidelines https://doc.rust-lang.org/book/ch09-03-to-panic-or-not-to-panic.html#guidelines-for-error-handling
  4. ^rust-create-custom-types-to-invalidation https://doc.rust-lang.org/book/ch09-03-to-panic-or-not-to-panic.html#creating-custom-types-for-validation

发布于 2022-12-13 21:38・IP 属地广东