昨天我们学了可恢复错误以及错误传递相关的内容
今天继续往下学
panic
正常情况下你都不会想要你的程序直接崩溃,毕竟你的代码是跑在线上的,如果崩溃就意味着可能将无法访问。所以正常情况下推荐是使用return
Result
的场景。
但是,如果你觉得这个地方就是需要用panic
,那就尽情的用~
除了你觉得必须要panic
的场景,实际上你在写库写组件或者写测试代码的时候,你就应该是使用panic
而不是return
Result
,因为这些场景就是很需要暴露出问题点。
组件这玩意儿越早暴露出问题越好,要啥都测不出来等上了线就炸了(测试出来挨打.jpg)。
虽然我们推荐是优先用返回Result
这种方式,但是这种方式比起panic
来说代码量会多些,结构也没有使用panic
那么简洁。
所以,如果你能确定有些场景一定不会有Err
,但是又需要有错误来兜底(绕过compiler
的警告)。那么你就可以使用panic
相关的方法。我们来看下例子
一个字面量的parse
成IpAddr
的类型,这肯定是不会有错的(当然,你导错库另说~)。
这种时候你完全可以用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
和一个method
叫value
,这个value
我们一般叫做getter
,返回私有的数据。
为什么要这么写呢?
有两点好处
<100 && > 1
),是不会产生实例的,会直接panic
,后面如果还有其他验证逻辑,就都可以放到这个new
关联函数里。这么做就优雅很多。
今天都是一些建议,实际开发还是看你自己~
最后,如果你觉得这篇文章对你有帮助的话请务必点个赞,谢谢~
发布于 2022-12-13 21:38・IP 属地广东