文档章节

返回值 还是 异常?

大道无形
 大道无形
发布于 2014/02/28 17:34
字数 486
阅读 250
收藏 2
点赞 0
评论 0

返回值 还是 异常?

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 


© 著作权归作者所有

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

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

lonsdale8734 ⋅ 2016/04/11 ⋅ 4

内建控制结构之使用try表达式处理异常

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

柳哥 ⋅ 2014/06/07 ⋅ 0

技术讨论:一个关于点赞功能与异常捕获处理的迷惑

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

徐建兴 ⋅ 2013/11/21 ⋅ 4

如何优雅的处理异常(java)

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

plugin ⋅ 2015/01/14 ⋅ 5

Java finally语句与return语句执行顺序解析

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

passionfly ⋅ 2015/04/18 ⋅ 0

使用C++11实现优雅的错误判断与多返回值

前言 这篇文章是在手机上写的,如果你没在手机上写这种文章,可能无法体会其中的滋味,那叫一个蛋疼。不止是这篇文章,我最近的几个项目全是在手机上编写。并不是我想这样,是因为机器坏了,...

句龙胤 ⋅ 2016/06/14 ⋅ 0

关于Task的一点思考和建议

前言 本打算继续写SQL Server系列,接下来应该是死锁了,但是在.NET Core项目中到处都是异步,最近在写一个爬虫用到异步,之前不是很频繁用到异步,当用到时就有点缩手缩尾,怕留下坑,还是小...

jeffcky ⋅ 2017/02/05 ⋅ 0

[每日一题]说说异常处理机制和最佳实践

这个问题仁者见仁智者见智,每个人心中的最佳实践不见得一致,但是你要有想法,这个很关键,如果连思考都没有思考过,那就不太好了。 很多高级语言都提供了异常处理,比如Java、Python、Rub...

UlricQin ⋅ 2014/09/27 ⋅ 1

[从C到C++] 1.10 C++ 异常处理(try和catch)

在程序设计过程中,我们总是希望自己设计的程序是天衣无缝的,但这几乎又是不可能的。即使程序编译通过,同时也实现了所需要的功能,也并不代表程序就已经完美无缺了,因为运行程序时还可能会...

wu_being ⋅ 前天 ⋅ 0

iOS 黑魔法 runtime 消息转发 ---附Demo

对象接收到一个不能响应的消息,runtime 的转发过程如上图。 demo地址 有个一个 类: Person.h 文件 Person.m 文件 我们只声明了方法 并没有实现它 当我们调用这个方法时,会抛出异常: 异常...

iOS_愛OS ⋅ 06/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决CentOS6、7,/etc/sysconfig/下没有iptables的问题

一、Centos 6版本解决办法: 1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存: service iptables save 3.重启iptables服务: service ...

寰宇01 ⋅ 32分钟前 ⋅ 2

数据库备份和恢复

备份:mysqldump -u root -p 数据库>磁盘路径 恢复:mysql -u root -p 数据库<sql脚本的磁盘路径

anlve ⋅ 今天 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部