返回值 还是 异常?

返回值 还是 异常?

1 异常

1.1 好处
提高代码可读性

根据区块来区分开正常流程和异常处理

可迅速追溯到错误源头

类库定义的异常基类本身能提供很多的信息,如InnerException,StackTrace等

1.2 坏处
阅读代码时,人眼无法轻易辨认出隐藏的异常

假设DoSomething1中会抛出异常,通过代码无法一眼看出DoSomething2是否会被执行。
如果需要确认DoSomething2是否会被执行,你需要了解DoSomething1会抛出哪些异常。
如果DoSomething1有关于会抛出的异常说明,那还算容易,否则你需要查看整个DoSo-
mething1调用树结构。

性能开销大

语言通用性问题

假如各模块由不同的语言写成,则只能在模块内使用异常。换言之,各语言的异常处理不具备通用性。

2 返回值

2.1 好处
没有异常的性能问题

单看代码,很容易辨认程序处理流程

客户代码编写者看到返回值,会有去处理这些返回值的责任。

2.2 坏处
特定场景使用限制

构造函数,线程处理函数等不允许有返回值的情况,以及返回值被用作其他用途的情况

客户代码不够清晰

3 我的理解
追求 稳定 高性能 的程序,慎用异常。

团队应为异常处理方式建立规范,以保证项目的统一(Consistency)性。

正确的使用异常,避免异常混入程序控制流。

模块间接口应采用返回值方式。自己模块内的异常确保自己进行了处理。

4 参考文章
Cleaner, more elegant, and harder to recognize—By Raymond Chen
Making Wrong Code Look Wrong—Joel on software
“拥抱”异常,还是,”固守”返回值?—DCCMX

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">