在Java 7中添加了Rethrow Exception功能。我知道它的概念,但是我想查看它的实际应用以及为什么需要此功能?
答案 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)
用例组合:
使用重新抛出,您可以编辑堆栈跟踪信息以进行 它更准确。同样,在需要时,您可以隐藏或摆脱 堆栈跟踪中不必要的内部细节。
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对象 通过将当前堆栈信息填充到旧版本中来创建 异常对象
将自定义消息添加到引发的异常。 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)。