文档章节

返回值 还是 异常?

大道无形
 大道无形
发布于 2014/02/28 17:34
字数 486
阅读 255
收藏 2

返回值 还是 异常?

1 异常

  

1.1 好处

  1. 提高代码可读性

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

  2. 可迅速追溯到错误源头

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

1.2 坏处

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

    DoSomething1();
    DoSomething2();

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

  2. 性能开销大

  3. 语言通用性问题

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

2 返回值

  

2.1 好处

  1. 没有异常的性能问题

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

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

2.2 坏处

  1. 特定场景使用限制

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

  2. 客户代码不够清晰

    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 


本文转载自:http://www.cnblogs.com/ChrisChen3121/archive/2013/03/20/2970923.html

共有 人打赏支持
大道无形
粉丝 4
博文 28
码字总数 7429
作品 0
海淀
技术主管
怎么包裹RestController的返回值

对所有RestController的返回值包裹一层status, 正常情况下status设置为1,抛异常时设置为0。 比如 @RestController@RequestMapping("/admin")public class TestController { } 当输入test=0时...

lonsdale8734
2016/04/11
697
4
内建控制结构之使用try表达式处理异常

抛出异常 异常的抛出看上去与Java一模一样,首先创建一个异常对象然后用throw关键字抛出。但在scala里,throw也是有结果类型的表达式。下面举个有关结果类型的例子: package scalaTestobjec...

柳哥
2014/06/07
0
0
技术讨论:一个关于点赞功能与异常捕获处理的迷惑

最近一直做一个关于"点赞"功能的服务器端(整个服务器功能的一个小部分),基本的需求主要是这样的: 用户发表了一个状态,浏览者可以点赞,但是点赞只能点一次.如果浏览者点了第二次,客户端就说"...

徐建兴
2013/11/21
990
4
如何优雅的处理异常(java)

1,我看开源中国的很多源码,比如负责从网络解析数据,从数据库的操作都抛异常。这么做的原因是什么。 2,是不是通常情况下,返回值是void的方法一般都抛出异常(如果有的话),有返回值的就...

plugin
2015/01/14
697
5
Java finally语句与return语句执行顺序解析

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会...

passionfly
2015/04/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[MicroPython]STM32F407开发板驱动OLED液晶屏

1.实验目的 1.学习在PC机系统中扩展简单I/O 接口的方法。 2.进一步学习编制数据输出程序的设计方法。 3.学习 F407 Micropython开发板控制OLED显示字符。 2.所需元器件 F407 Micropython开发板...

bodasisiter
19分钟前
0
0
php require和include 相对路径一个有趣的坑

以前总是被教育,不要使用相对路径,这样性能比较差,但是相对路径的问题不仅仅是性能哦,看下面这里例子 这是项目结构 .├── main.php├── t│ ├── t1.php│ └── t2.php└─...

anoty
19分钟前
9
0
x64技术之SSDT_Hook

测试环境: 虚拟机: Windows 7 64bit 过PG工具 驱动加载工具 PCHunter64 系统自带的计算器和任务管理器等 实现思路: 实际思路与win32的思路一样.都是替换SSDT表里边的函数地址.不过微软被搞怕...

simpower
20分钟前
0
0
TreeMap源码分析,看了都说好

一、简介 TreeMap最早出现在JDK 1.2中,是 Java 集合框架中比较重要一个的实现。TreeMap 底层基于红黑树实现,可保证在log(n)时间复杂度内完成 containsKey、get、put 和 remove 操作,效率很...

Java小铺
30分钟前
0
0
协变、逆变

概念 假设 A、B表示类型 ≤ 表示继承关系 f<⋅>表示类型转换 若A ≤ B,则 A是B的子类,B是A的超类 协变、逆变 什么是型变?型变(type variance)允许对类型进行子类型转换。 为了下面讲解先...

obaniu
36分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部