重新抛出异常实际应用

时间:2018-10-10 08:24:54

标签: java java-7

在Java 7中添加了Rethrow Exception功能。我知道它的概念,但是我想查看它的实际应用以及为什么需要此功能?

3 个答案:

答案 0 :(得分:1)

使用Rethrowing Exceptions with More Inclusive Type Checking功能

  

在Java SE 7中,您可以在rethrowException方法声明的throws子句中指定异常类型FirstException和SecondException

当您要声明可能会抛出的特定异常时(主要是在捕获一般错误时)

例如,请参见Precise Rethrow example

public static void precise() throws ParseException, IOException{
    try {
        new SimpleDateFormat("yyyyMMdd").parse("foo");
        new FileReader("file.txt").read();
    } catch (Exception e) {
        System.out.println("Caught exception: " + e.getMessage());
        throw e;
    }
}

这也使您的代码符合Sonar的Raw Exception rule

请注意,您可以类似地捕获Throwable

答案 1 :(得分:1)

我将以here为例 这是示例:

  static class FirstException extends Exception { }
  static class SecondException extends Exception { }

  public void rethrowException(String exceptionName) throws FirstException, SecondException {
    try {
      if (exceptionName.equals("First")) {
        throw new FirstException();
      } else {
        throw new SecondException();
      }
    } catch (FirstException e) {
      throw e;
    }catch (SecondException e) {
      throw e;
    }
  }

这将同时使用Java 6和7进行编译。

如果要保留方法签名中的检查异常,则必须在Java 6中保留繁琐的catch子句。

在Java 7中,您可以通过以下方式进行操作:

public void rethrowException(String exceptionName) throws FirstException, SecondException {
  try {
    if (exceptionName.equals("First")) {
      throw new FirstException();
    } else {
      throw new SecondException();
    }
  } catch (Exception e) {
    throw e;
}

因此,您的好处是您不必麻烦的catch子句。

答案 2 :(得分:0)

用例组合:

  1. 使用重新抛出,您可以编辑堆栈跟踪信息以进行 它更准确。同样,在需要时,您可以隐藏或摆脱 堆栈跟踪中不必要的内部细节。

    try     { //... }
    catch (Exception e) { throw (Exception) e.fillInStackTrace(); }
    

    fillInStackTrace的实际应用在这里有很好的解释: Why is Throwable.fillInStackTrace() method public? Why would someone use it?

    布鲁斯·埃克尔(Bruce Eckel)写的《用Java思考》一书中的语录:

      

    如果要安装新的堆栈跟踪信息,可以通过以下方法进行安装   调用fillInStackTrace( ),它返回一个Throwable对象   通过将当前堆栈信息填充到旧版本中来创建   异常对象

  2. 将自定义消息添加到引发的异常。 Add custom message to thrown exception while maintaining stack trace in Java

我能想到的一个简单示例:

void fileOperator(String operationType) throws Exception(){ ... }

void fileReader() throws Exception {
    try{
        fileOperator('r');
    }
    catch(Exception e){
        throw Exception("Failed to read the file", e);
    }
}

void fileWriter() throws Exception{
    try{
        fileOperator('w');
    }
    catch(Exception e){
        throw Exception("Failed to write the file", e);
    }
}

此外,我们可以从catch块中抛出更具体的异常类型(例如FileReadException,FileWriteException)。