返回值 还是 异常?
1 异常
1.1 好处
提高代码可读性
根据区块来区分开正常流程和异常处理
可迅速追溯到错误源头
类库定义的异常基类本身能提供很多的信息,如InnerException,StackTrace等
1.2 坏处
阅读代码时,人眼无法轻易辨认出隐藏的异常
1 2 3 |
DoSomething1(); DoSomething2(); |
假设DoSomething1中会抛出异常,通过代码无法一眼看出DoSomething2是否会被执行。
如果需要确认DoSomething2是否会被执行,你需要了解DoSomething1会抛出哪些异常。
如果DoSomething1有关于会抛出的异常说明,那还算容易,否则你需要查看整个DoSo-
mething1调用树结构。
性能开销大
语言通用性问题
假如各模块由不同的语言写成,则只能在模块内使用异常。换言之,各语言的异常处理不具备通用性。
2 返回值
2.1 好处
没有异常的性能问题
单看代码,很容易辨认程序处理流程
客户代码编写者看到返回值,会有去处理这些返回值的责任。
2.2 坏处
特定场景使用限制
构造函数,线程处理函数等不允许有返回值的情况,以及返回值被用作其他用途的情况
客户代码不够清晰
1 2 3 4 5 6 7 8 9 |
if (returnVal == Success) { //DoNormalFlow } else if (returnVal == ERR1) { //Handle ERR } |
3 我的理解
追求 稳定 高性能 的程序,慎用异常。
团队应为异常处理方式建立规范,以保证项目的统一(Consistency)性。
正确的使用异常,避免异常混入程序控制流。
模块间接口应采用返回值方式。自己模块内的异常确保自己进行了处理。
4 参考文章
Cleaner, more elegant, and harder to recognize—By Raymond Chen
Making Wrong Code Look Wrong—Joel on software
“拥抱”异常,还是,”固守”返回值?—DCCMX