在编写代码的过程中,经常会遇到这样的选择,检查到一个不正常的情况,或者某个操作失败,或者检测到
某个异常,此后该怎么办?是抛出一个异常?还是放回一个表示操作失败的返回值?

前一段在北京和小汤他们谈起这个问题的时候,有了一些粗略的想法。这段时间在 Leo4Net 的开发中,一些
想法逐步清晰起来。

=== abc ===

=== 两种方式的不同 ===

× 返回值很容易被检测,而捕获异常的代码则相对比较长
    × 抛出以及捕获异常需要更多的系统开销
    × 如果忽略返回值,调用者可以继续,但没有捕获的异常则将终止调用者的执行

=== 应该抛出异常的几种情况 ===
在这些情况下,应该是要抛出异常的:

=== 无法通过参数检查 ===
    
    例如空值、参数取值范围等,因为参数的规则说明是作为方法签名的一部分发布的,调用者应该很清楚
    调用这个方法所需要的参数的规格,但是调用者现在传入的错误的参数,说明调用者本身这时候很可能
    就已经出现问题了。
    
    对参数进行检查本身也是一个编写一个方法的良好习惯,这可以保证方法本身在一个相对比较稳定可知
    道状态下工作,因此方法本身将更简单也更稳定。
    
    总之,拒绝非法的参数,并抛出异常。

=== 将可能导致以后的相关功能出错 ===
    
    如果一个异常或者错误的参数将导致以后更多的异常或者以后的某个功能异常,那么不要延迟,立即抛
    出异常。

例如有一个属性 Filename 用来保存将被保存的文件的名称,一个的方法 Save 将保存到 Filename 所
    指定的文件名中去,显然在给 Filename 属性赋值时,如果给出一个包含非法文件名字符的字符串,那
    么将导致 Save 方法中会有异常发生,不论 Save 方法是否对 Filename 再进行检查,这时候距离设定
    Filename 的代码可能已经相当远了,因此在设定 Filename 的时候,就应该要进行这种有关的检查,
    如果文件名不合法,立即抛出异常,而不要等到以后再来发现这个问题。
    
    上述对参数进行检查其实很多也是这种情况,特别一些空值参数,将可能导致以后使用该参数的时候发
    生空值异常。
    
    
=== 不应该抛出异常的几种情况 ===

=== 不影响程序继续运行 ===
    
    如果一个错误并不影响程序逻辑的正确性,或者不影响此后代码的继续运行,那么可以不必抛出异常。
    
    一个典型的例子例如,从集合中删除指定键值对应的元素,但指定的键值其实并不在集合中,这显然是
    一个意外情况,但是,就此继续下去,以后的程序应该还可以继续有效的运行,因为即使在正常情况下
    也不过是这个元素不再存在于集合中而已。返回一个整数值表示删除掉的元素的个数,如果没有找到给
    定的元素,则返回0表示没有元素被删除。这个例子的另一种情形是,当前集合元素因为某种原因被锁住
    不能删除元素,那么应该抛出一个异常表示删除失败,而不是返回0表示没有删除元素。
    
别人评论:

非常赞同。
对于这种难以明确界定的问题,一方面有大原则,但有时候还需要视实际情况酌情处理。“将可能导致以后的相关功能出错”,我的理解是这样的:对于一定导致以后出错的情况,决定抛出异常——因为一个出错的软件接下来只能产生负面功效;对于可能出错也可能不错的情况,可以延迟抛出异常,在真正碰到错误时应该有更高层的异常捕捉,甚至平台——因为抛出异常是有代价的,如果在有希望的时候马上带来损失,相信有时候不可取,而如果不抛出异常会带来更大损失,也许就立即抛出了。总之,我觉得软件的稳定性要求不同,选择是有区别的。这也许是程序员的抉择——但最终是需求的抉择。
方法始终对参数有效性进行检测——真的很重要。
很多时候,大家想到了异常,在怎样抛出异常的话题下面,怎么详细地定义可预见的异常、尽量避免异常产生的损失、尽量修复和弥补,是一个稳定健壮软件必须做好的事情。

什么时候要抛出异常? !相关推荐

  1. C++ 笔记(20)— 异常处理(抛出异常、捕获异常)

    异常提供了一种转移程序控制权的方式. C++ 异常处理涉及到三个关键字: try . catch . throw . throw : 当问题出现时,程序会抛出一个异常.这是通过使用 throw 关键字 ...

  2. python 抛出异常raise

    原因:  测试数据的时候命名找不到该文件,但是通过try except的执行状态却为"成功" 查找为什么出错了仍可以继续运行try 分支: p = os.system('pytho ...

  3. 请不要将抛出异常作为业务逻辑使用!!!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:myfor www.cnblogs.com/myfor/p/ ...

  4. python3 抛出异常_Python3 异常

    一.错误 语法错误:使用 Pycharm 工具编写 Python 程序,编译器就会检测出来并给予提示,因此,编写好的程序几乎不会出现错误. 逻辑错误:编译器不会提示,例如:0作为被除数 二.异常 Py ...

  5. java中的抛出异常throws与throw

    throws与throw throws是方法可能抛出异常的声明.(用在声明方法时,表示该方法可能要抛出异常) 语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{. ...

  6. java 回滚异常_回滚事务并关闭抛出异常的连接

    目前在我的JavaEE应用程序服务器中使用本地和远程EJB,MDB(Singleton和Stateless),我正在使用JDBC-Transactions for Hibernate Core . 管 ...

  7. 《数据结构与抽象:Java语言描述(原书第4版)》一JI2.3 抛出异常

    本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. H ...

  8. python中try Except抛出异常使用方法

    对于python自动化测试同学来讲try的作用太大了. 我们要保证每条用例都能得到我们预期并在测试报告中给出正确的pass或fail的结果 就可以通过try语句来很好的实现,并且能保证这个pass或f ...

  9. oracle 游标中抛出异常的处理方式

    在oracle游标的使用中,用for循环是一种较直接open 游标然后关闭游标更好的应用方式.现在写两个存储过程,验证这两种情况下游标中抛出异常后游标是否正常关闭. 现在有一张表emp,表结构如下: ...

  10. php异常跑出,php 抛出异常但继续往下执行为什么

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 class Base { static $DB; protected $sth; static $stmt = array(); function __c ...

最新文章

  1. linux upx 报错 NotCompressibleException
  2. python自学平台-怎么自学python,大概要多久?
  3. 排序算法-07归并排序(python实现)
  4. gRPC in ASP.NET Core 3.x - gRPC 简介(1)
  5. Visual C++中MFC消息的分类
  6. html dom 知乎,知乎登录页 - 粒子运动效果
  7. 学神python笔记
  8. c语言static int x,为什么要使用static_cast int (x)而不是(int)x?
  9. linux neo4j weget,关于在linux中安装neo4j的步骤
  10. Android应用性能优化整体策略
  11. MySQL从入门到精通详细教程
  12. android 点餐系统 构思
  13. web打印三种实现方式
  14. sqlmap使用教程(sqli-labs1-10详解)
  15. (光滑样条)Smoothing spline的数学推导
  16. android模拟器 diy,DIY泡沫黏液模拟器
  17. 单兵渗透工具-Yakit-Windows安装使用
  18. vue与nodejs
  19. python程序怎么运行-Python如何运行程序
  20. 蒙那多MONARCH频闪仪维修VBX振动分析/相位分析测量仪

热门文章

  1. iframe中的方法
  2. 特征工程——推荐系统里的特征工程
  3. 2021-11-08笔记本搜不到手机热点的解决
  4. 备受瞩目的“2017全球云计算大会”有哪些亮点值得关注?
  5. 【机器学习之向量求导】分子布局 分母布局
  6. 计算机技术在美术方面的应用,计算机技术在图形图像处理中的应用
  7. Python matplotlib 论文画图之常用操作
  8. virtualbox中安装xp系统、安装oracle数据库到虚拟机的xp系统中、主机连接oracle、备份xp系统、oracle数据库的一些基本概念(学习oracle数据库的准备工作)-day01
  9. 在线考试系统设计时必须考虑的问题之三----------考试题库问题
  10. ubuntu20.04静态编译qt5.14.2报错