处理算术异常

4

我创建了自己的异常来处理像算术异常和其他涉及数学规则的情况。但是当我调用它时,例如在除以零的情况下,它从未进入我的异常,而是进入算术异常。


你可以提供一小段相关代码吗? - mre
在第一个类中:public BigDecimal divide(BigDecimal val1 , BigDecimal val2) { BigDecimal result = val2.divide(val1,99, BigDecimal.ROUND_HALF_UP); return result; }在第二个类中:try{ ...} catch (Exception e) { throw new EvaluatorException(expression); }catch(MyOnException){ ... } - alculete
在捕获更具体的MyOnException之后,您需要捕获Exception。Java将执行可以从抛出的异常进行转换的第一个catch块。任何在catch(Exception e)之后的catch块都无法到达。 - Ryan Gross
如果有catch(Exception e),那么就没有办法捕获我的异常。 - alculete
@Spammer,你需要反转catch块的顺序。即先捕获MyOnException,然后是Exception - Péter Török
显示剩余2条评论
3个回答

10

除以零和其他“标准”算术错误由运行时或类库处理,它们不知道您定义的异常。只有在适当时明确地throw它们时,才能在自己的代码中使用自己的异常。

当然,可以捕获类库抛出的任何算术异常并将其封装成自己的异常:

try {
  ...
} catch (java.lang.ArithmeticException exc) {
  throw new MyException("An arithmetic error occurred", exc);
}

我的应用程序有一个处理计算的类,当出现错误时,我创建了一个自定义异常来处理简单的异常(例如字母而不是数字),但是当我尝试处理算术错误时,它总是进入该异常。 - alculete
我有这样的代码:try{ }catch(第一个异常){代码} catch(我需要的异常){代码}并且只会进入第一个异常。 - alculete
@Spammer,你遇到的异常是否被第一个catch块捕获了,其是否比你实际需要的异常更为一般(即是它的超类)?catch块按照定义的顺序依次检查并且只有其中一个会被执行。因此,在通用异常之前一定要始终“catch”更具体的异常类型。 - Péter Török

4

在这些情况下,您将不得不捕获标准的Java异常,并将它们包装在您的异常中。

try {
   int x = 10/0;
} catch (ArithmeticException ex) {
   throw new MyException("My additional text", ex);
}

通常情况下,除非您还添加了一些额外的细节,否则添加新的异常并不是一个好主意。


Ryan,感谢您的贡献,但我自己也可以做。我正在尝试避免使用Java异常,而是使用我自己的异常,例如,使用“MathsException”代替ArithmeticException。 - alculete

0

是的,因为异常是由JDK源代码抛出的,而不是你。如果你想执行一些自定义逻辑,可以在你的catch DiviedByZeroException块中重新抛出你自己的异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接