Java中的链式异常

时间:2020-01-09 10:34:57  来源:igfitidea点击:

在Java中使用链接式异常,可以将一个异常与另一个异常关联。链式异常有助于一个异常导致另一异常的情况。在这种情况下,将引发的异常是第二个异常,但是我们可以在第二个异常中设置原始异常的原因,从而以某种方式链接这些异常。

例如,我们正在编写一个传递两个参数的代码,然后将这些参数转换为整数。如果没有传递两个参数,这将导致ArrayIndexOutOfBoundsException,但真正的原因是没有足够的参数。因此,我们可以使用相应的消息将原因设置为IllegalArgumentException。

Java中链式异常的构造函数和方法

在Throwable类中,有两个支持链式异常的构造函数。

  • Throwable(Throwable expObj)–这里的expObj表示导致当前异常的异常。
  • Throwable(String msg,Throwable expObj)–使用此构造函数,我们还可以将适当的消息与异常一起传递。

在Throwable类中,有两种方法支持链式异常。

  • Throwable getCause()–此方法返回导致当前异常的基础异常。
  • Throwable initCause(Throwable)–此方法设置当前异常的原因。 initCause的Throwable参数是导致当前异常的异常。

Java链式异常的示例代码演示

让我们为上面已经说明的示例编写Java代码。在代码中,我们希望传递两个参数,然后将这些参数转换为整数。

public class ChainedExpDemo {
  public static void main(String[] args) {
    ChainedExpDemo ced = new ChainedExpDemo();
    try{
      ced.divide(args);
    }catch(Exception ex){
      System.out.println("Caught - " + ex);
      System.out.println("Original Cause " + ex.getCause());
    }
  }
	
  private void divide(String[] args){
    try{
      int num1 = Integer.parseInt(args[0]);
      int num2 = Integer.parseInt(args[1]);
      double result = num1/num2;
    }catch(ArrayIndexOutOfBoundsException ex){
      if(args.length != 2){
        ex.initCause(new IllegalArgumentException("Two parameters should be passed"));
      }
      throw ex;
    }
  }
}

在不传递任何参数的情况下执行代码时的输出

Caught - java.lang.ArrayIndexOutOfBoundsException: 0
Original Cause java.lang.IllegalArgumentException: Two parameters should be passed

链式异常的实际用法

如果我们不想将特定于层的异常传播到另一层,但又想保留原始异常,则Java中实际使用链式异常是有用的。这也是异常处理的最佳实践之一。

例如,如果SQLException被捕获在数据库层中,则没有理由让相同的异常传播到业务层。在这种情况下,最好的办法是在DAO层中捕获SQLException(检查后的异常),然后抛出另一个应传播到业务层的异常(未检查)。我们应该将原始异常实例作为参数发送。

catch(SQLException ex){
    throw new RuntimeException("Error in DB layer", ex);
}