BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #42050同步于 2012/3/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

异常处理

airb9
2012/3/22镜像同步9 回复
想请教大家异常处理的原则。我的理解如下: 一般如果你写的函数你知道怎么处理异常,就该处理,就近处理;如果不知道,则应该捕获它,抛出去,由调用者接收,直到能处理的地方再处理。 那么基于这个原则,我们不能在整个程序的最外面只弄一个异常处理去处理所有的异常,因为那样你根本不知道你有可能捕获哪些异常,具体那块出的异常;而且线程之间的异常不能传递,你在主线程捕获不到其他线程出现的异常,程序一样会crash。 不知道我说清楚没有,麻烦大家了,我想知道正确的处理异常的原则和方法。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
zzcc机器人#1 · 2012/3/22
如果你知道你在干什么,为什么不可以在最外面捕获所有异常?在最外面捕获异常作为fallback,重启线程记录异常,然后让系统恢复。 如果不需要,就让它crash,crash也是一种功能。。
airb9机器人#2 · 2012/3/22
。。。。 crash是不能接受的吧,一般产品代码中每个线程入口点肯定要try/catch的。。 我的意思是你不能只在最外面捕获,处理,比如有的时候有可能空指针,有的时候有可能socket断了,那你在写相应的那段函数的时候如果可以预料到,就应该去处理,前提是你知道怎么处理。 如果不知道,最后传到了最外面的异常处理函数时,再由它决定是关闭应用程序还是重启一些东西还是让状态机回到初始状态
zzcc机器人#3 · 2012/3/22
为什么crash不可接受?QQ你没见过crash吗?只不过它包装了一下而已。 除非是服务器daemon,与其一声不吭不如crash掉然后让用户报告这个异常。 如果错误是没有预料到的,这是bug,得修。 【 在 airb9 的大作中提到: 】 : 。。。。 : crash是不能接受的吧,一般产品代码中每个线程入口点肯定要try/catch的。。 : 我的意思是你不能只在最外面捕获,处理,比如有的时候有可能空指针,有的时候有可能socket断了,那你在写相应的那段函数的时候如果可以预料到,就应该去处理,前提是你知道怎么处理。 : ...................
airb9机器人#4 · 2012/3/22
谢谢zzcc,我同意如果错误没预料到,是bug, 需要修。 关于crash,有可能咱俩说的不是一回事,你说的可以接受的crash其实也是你捕获到了异常,只不过处理方式是让用户发个报告,然后关闭应用程序,对吗? 如果是,我同意。 我想讨论的恰恰是我们怎么在程序中避免有没被捕获到的异常导致程序强行crash,那样出乎我们开发者的预料,肯定用户也骂你:) 我想问有什么原则吗?我看你似乎同意只在每个线程最外边去处理,不需要在异常发生的最近地点处理(如果能处理的话). 我想知道大家都是什么典型做法?哈哈。。
zzcc机器人#5 · 2012/3/23
如果能处理的就处理,不能处理的继续抛出去 为了友好,在最外层捕获掉所有的异常,记录环境、出错信息。然后该退出退出 我环境都是Linux,crash都直接stderr了。。所以都不管。。 如果是lib,捕获掉所有异常,包装成你自己的再抛出去。 【 在 airb9 的大作中提到: 】 : 谢谢zzcc,我同意如果错误没预料到,是bug, 需要修。 : 关于crash,有可能咱俩说的不是一回事,你说的可以接受的crash其实也是你捕获到了异常,只不过处理方式是让用户发个报告,然后关闭应用程序,对吗? : 如果是,我同意。 : ...................
airb9机器人#6 · 2012/3/23
明白了,谢谢了
iFadeToBlack机器人#7 · 2012/3/23
一般来说main loop对日常开发是透明的,不应该总是改这个。所以在这里catch所有的unexpected exception,然后起另一个进程,告诉它崩溃啦,让它赶紧过来抓dump和log,zip最后send
wks机器人#8 · 2012/3/25
不能处理的异常就不要处理。 捕获了不抛,就代表已经处理了,处理了就代表程序接下来就是”正常运行“了。 如果出现异常之后程序的工作就不正确了,就要抛,不要试图捕获它然后让程序将错就错地继续跑。
airb9机器人#9 · 2012/3/26
谢谢各位 比之前明白了很多。