Java设计出checked exception有必要吗( 二 )
对于基础设施团队,需要使用Checked Exception,并且定义良好的异常继承体系,并且认真处理所有的异常。有限度的使用RuntimeException。对于业务团队,基于RuntimeException定义了一个BizException来描述各种业务问题,这个BizExcpetion包含了错误码和错误描述信息;同时定义InteralServerError来包装各种系统错误,比如网络超时等。在输出http response时,二者的输出不同,然后定义不同的监控和报警机制。针对特定的异常,由产品和技术共同商讨介入来设计哪些可以完全不管(比如一个不关键的数据拿不到),软处理;哪些要前端用户知晓和处理(比如登录时用户名或密码错误);哪些由程序尽量自己处理(比如关注某个产品超时,后端要尝试重试几次)相信大多数团队也会这么做。
说完了Java,我们可以看看其他语言都是怎么处理异常的。比如go用了err(大致等价于错误码,但可以包含一些数据信息),因此异常可以不捕获往上抛的好处就得不到。因此这可以解释为什么很多搞底层系统开发的人并不会觉得go没Exception很难用,因为反正错误都需要严谨的处理,Exception那点优势可能不是很重要。但是即便如此,go并不会强制调用者必须处理写if err != nil 。
BTW,给go加上Exception的呼声似乎越来越强烈,估计是业务开发者越来越多了。javascript也有Error,但是不是很喜欢搞继承体系。因此javascript里一般就只会用“Error”,“TypeError”这种简单的东西。因为动态语言,开发者可以选择自己往Error里赛自己喜欢的东西,并用一些松散的约定来解决问题。比如:throw Error("ERR_INVALID_PASSWORD");简单的用字符串来定义错误。javascript的主要应用场景在前端,这时出错要不给用户展示错误信息,要不用错误上报接口报给后端。复杂的异常体系基本没用,更谈不上什么Checked exception。
nodejs这边的exception处理可以借鉴很多java这边的经验。kotlin直接砍掉了Checked Exception,但保留了其他常规的异常语法(改成了Expression,所以用起来爽很多)。他的文档直提供了两个论据:
Java\u0026#39;s checked exceptions were a mistake (Rod Waldhoff)The Trouble with Checked Exceptions (Anders Hejlsberg)swift更有趣,swift认为函数的异常模式有两种:
会抛出异常的,于是函数名后边要声明一下“throws”,但是不需要声明会抛出什么异常;肯定不会抛出异常的,所以实现中必须吃掉各种可能发生异常的情况。编译器会强制确保这个语义的正确。throws这种方式,大概等价于Java中直接throws Exception。
因此从工程角度和语言发展角度来讲,Checked Exception早已经被扔进了垃圾堆。在整个工程项目的错误处理体系里,它的作用已经越来越少。新的语言纷纷抛弃掉这个华而不实的设定。因此我也希望广大初学者只要知道Checked Exception是什么就好,实战时还是根据业务场景来设计错误处理。
--------
P.S. 也许还有人觉得Checked Exception是一种可以推进减少程序错误,提高健壮性的好措施。错的是懒惰的,不称职的程序员,而不是Checked Exception。但从我认为,如果一个措施不能有助于解决问题,反而加重问题,那就是无用的。不要把时间和精力浪费在无用的事物上。
■网友
Checked exception其实是很棒的概念。与它对立的概念是runtime exception。
虽然它们名字里都有exception,但是它们其实并不是同一种概念。
在类型理论里,checked exception其实是union type,而runtime exception才是真正的exception。
我们沿用惯例,仍然称他们checked exception(CE)和runtime exception(RE)。
对应的,try..catch..对与CE和RE其实也是完全不同的概念(虽然在JVM层的实现上使用了相同的机制)。从type theory角度讲,Java其实重载了try..catch..这个概念(即用于实现两种完全不同的语法)。
推荐阅读
- “厉行节约反对浪费”主题设计公益活动成果发布
- 趣头条|雪佛兰创界,外观设计大气,你会喜欢这款车吗?
- 环球车讯网|全新大众途观,外观的设计更加时尚,更加大气,“满满”的高级感
- 趣头条|日产奇骏,整体设计不错,你会喜欢吗
- 趣头条|大众ID.3外观设计风格极具未来感,太好看了
- 趣头条|威马推出EX5-Z曜石精英版车型,车身采用宽体设计,外形魁梧大气
- 趣头条|本田飞度,整体设计不错,你会喜欢吗
- 设计专业学生上传自己的作品,用哪个网站比较好
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 钟叔驾道|10万以内买SUV,这几款国产精品真心不错,设计精致配置高
