daya0576 / comments.daya0576.github.io

0 stars 0 forks source link

blog/20210920/java-checked-exception/ #112

Open utterances-bot opened 2 years ago

utterances-bot commented 2 years ago

天使还是恶魔!浅谈 Java 中的 checked exception | Henry Z's blog~

记得有一次,觉得处理异常太麻烦,直接 catch 后包装一个 RuntimeException 一路抛了上去。结果被小伙伴 CR 时喷了一顿~ 这篇文章将简单介绍 Java 中异常的分类,使用 checked exceptions 的最佳时机,以及为什么无脑抛 RuntimeException 不是一个好习惯。最后分享如何在 lambda 表达式中,更加优雅的处理 checked

https://changchen.me/blog/20210920/java-checked-exception/

daya0576 commented 2 years ago

沙发

yuchenyang1994 commented 2 years ago

其实java/python这种错误处理方式一直以来都有歧义,换句话说,可能很多人把意思能错了。本意上,error和exception是完全两种含义,错误是错误,异常是异常,两者不同,但是java/python当中,处理方式却是一样的,这就造成你做出这种事的核心问题。反观在go/rust 这类较新的语言设计中,已经刻意区分了两种异常类型,他们管异常叫panic,指的是直接会导致程序崩溃不可恢复的错误,错误叫error ,rust比较激进,如果一个方法或者函数抛error,就必须处理,不然编译器不让过,go呢就简单点,如果你不处理错误也不会导致程序崩溃(实际上没有,经常会空指针直接导致panic),而且异常不是不可以恢复,只是处理方式不一样,例如

go

func HandlePanic() {
   defer func() {
      err := recovery()
      fmt.Println(err)
   }()
   go http.Sever() // 这里可能会导致panic
}

rust比较简单,直接在编译配置文件里写panic后应该展开错误还是直接abort