跟我学代码架构设计模式之--异常还是返回值?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w1857518575/article/details/85164075

废话少说 直接正题

写JAVA函数到底是用抛出异常的方式还是用特定返回码的方式来标识函数执行错误呢?

我来说说我的设计哲学: 用抛出异常的方式比较好!

首先先来分析下程序执行的流程,当一个线程启动后,不管是面向对象的语言还是面向过程的语言,本质上都是以函数作为执行单位的,函数嵌套函数,一个函数对应一个栈帧作为函数执行上下文,另外函数执行过程中还有可能操作堆区的数据。

更底层分析下,线程执行在执行cpu指令的时候如果出现指令或数据错误,就会产生一个CPU异常,然后跳转到异常处理程序去处理错误,有些CPU异常可以恢复,比如缺页异常,有些异常不可以恢复,直接中断程序的执行~ 怎么样 发现了没,操作系统和CPU都是采用的类似抛异常的方式来处理错误!

这里先说说我的语义哲学:返回值应该代表一个函数成功执行后的结果,成功就是成功,函数能返回就代表函数执行成功,不应该在函数执行失败后还要返回!也就是说,通向成功的路只有一条,错误绝对不能按正常的返回来处理!函数执行中出现错误,理应打断正常的执行流程,从异常出口出去通知给上层调用者!

先分析下用函数返回值来标识函数错误的情况:通常做法是函数的成功失败都通过返回值返回给调用者,如果被调用者没有给出详细的文档说明,在调用者看来,我不知道我调用你返回的到底是成功还是失败,调用者必须在被调用者返回后的后续指令中同时处理所有可能的错误,这样的话,函数返回就不是单一语义,即使函数返回确实是单一语义的成功!WTF!

再分析下用异常标志错误的情况:被调函数在执行过程中抛出异常,调用者的处理代码中捕获各种异常并分别处理;调用者在被调者返回成功后就只有一种语义:成功!一切就很美好了~

另外异常处理还带来额外的好处:

1 可以区分运行时异常和非运行时异常,很多运行时异常我们调用者无能为力,可以被允许不做捕获处理,非运行时异常属于程序错误,要求调用者必须做处理!

2得益于继承机制,异常类型也可以继承,我们可以按需捕获父类异常或者具体异常,多么美好的设计~

(完)

猜你喜欢

转载自blog.csdn.net/w1857518575/article/details/85164075