为什么小类型的异常捕获了之后再抛出Exception?
老师教写的代码中,如果需要捕获异常,比如是FileNotFoundException,这种异常必须捕获。老师直接捕获了Exception之后又在catch里面抛出了Exc...
老师教写的代码中,如果需要捕获异常,比如是FileNotFoundException,这种异常必须捕获。老师直接捕获了Exception之后又在catch里面抛出了Exception,不知道为什么要这么做,直接抛出具体的异常不好吗?
展开
1个回答
展开全部
一般来说,有些异常类型需要先“加工成为带有特定解释信息的异常”,当我们有很多方法调用的层次时,比如你提到的方法调用,外面有又其它方法调用它时,这个层次很深,每个地方都可能有不同类型的异常抛出来,那么在最外面一层就无法精确地知道当前拿到的异常是什么类型(我们不会写上十几个 catch 语句,或者说有些异常是 unchecked),这个时候,对于最外面的方法来说,负担很重,它如果无法识别出异常的类型,就不好决定是把异常的消息直接显示在用户的界面上还是只提示未知错误就完事了,我们要想到,如果这个异常是在说“用户没有正确地输入一个业务上的输入数据”,这种异常消息应该返回到界面上给用户,这个时候不能说“未知错误”,而有时候确实不应该让用户知道一些他们无法理解的技术性的消息(比如 Null Pointer Exception 就应该显示成未知系统错误),为了达到尽量区分这些消息的目的,我们需要在最早捕获到这个错误消息时(那个时候能精确地知道是什么错误类型)做一个加工转而抛出一个像 throw new KnownException("无效数据“); 或 throw new KnownException("未知系统错误,请咨询技术人员”); 这样加工一次后再抛出,到了最外面一层时程序就不需要再去判断异常的类型是什么,只区分 KnownException 和 非 KnownException 两种类型就可以了。因为对于 KnownException 来说,消息中已经是用户能看得懂的描述就可以直接显示在用户的界面上了,而对于非 KnownException 来说转换成 “未知系统错误,请咨询技术人员” 然后显示在用户界面上就可以了。这样一来,普通的不懂技术的用户也知道这个消息是在说什么。
在异常刚发生的时候往往是最能精确地判断错误类型的时刻,到了调用层次的最外面时要处理的异常类型太多了,很难兼顾所有情况。
如果我们不这样把异常错误分类的话,对用户来说可能得到的就是只有”未知错误“ 或 直接把用户看不懂的技术性消息(比如 Null Pointer Exception ) 显示在用户界面上,这两个情况都是不应该的,也是不友好的。因为不懂技术的用户看到这些,完全不明白你在说什么,也不知道自己该做什么。
在异常刚发生的时候往往是最能精确地判断错误类型的时刻,到了调用层次的最外面时要处理的异常类型太多了,很难兼顾所有情况。
如果我们不这样把异常错误分类的话,对用户来说可能得到的就是只有”未知错误“ 或 直接把用户看不懂的技术性消息(比如 Null Pointer Exception ) 显示在用户界面上,这两个情况都是不应该的,也是不友好的。因为不懂技术的用户看到这些,完全不明白你在说什么,也不知道自己该做什么。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询