确定哪个方法引发异常
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了确定哪个方法引发异常相关的知识,希望对你有一定的参考价值。
下面的代码捕获到一个IOException
,第一个异常抛出将被捕获。要确定哪种方法抛出IOException
是将每种将IOException
抛出的方法包装在try catch块中的唯一解决方案?我问,因为我计划好的解决方案增加了许多尝试捕获代码,也许还有一个更干净的解决方案来确定哪个方法正在抛出IOException
?
import java.io.IOException;
import java.net.SocketException;
public class Driver {
private static void te() throws IOException {
throw new java.net.SocketException("Connection Reset");
}
private static void te2() throws IOException {
throw new java.net.SocketException("Connection Reset 2");
}
private static void te3() throws IOException {
throw new java.net.SocketException("Connection Reset 3");
}
public static void main(String args[]) {
try {
Driver.te();
Driver.te2();
Driver.te3();
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案
答案取决于您所需的逻辑。如果根据引发异常的方法对异常的处理方式有所不同,(这意味着在catch中,您需要根据引发异常的方法编写不同的错误处理代码,那么您确实需要包装每个方法调用进入单独的try-catch中。但是,如果错误处理相同,则您的代码就可以了(除非通常,将您的stacktrace打印到日志文件中),并且您可以通过读取stacktrace找出哪个方法引发了异常但是,如果错误处理相同,那么您的代码就不必知道哪个特定方法引发了异常。
另一答案
我不知道您为什么要这样做,并且肯定会远离此代码片段,但是在“现实生活中” 我会考虑扩展IOException:因此您将拥有一个在主方法中进行三次捕获的单次尝试。你喜欢这个解决方案吗?
另一答案
为每个方法创建自定义异常:
class TeException extends IOException { /* constructor */ }
private static void te() throws TeException {
throw new java.net.SocketException("Connection Reset");
}
然后,使用单独的catch块很容易区分多个异常:
try {
Driver.te();
Driver.te2();
Driver.te3();
} catch (TeException e) {
e.printStackTrace();
} catch (Te2Exception e) {
e.printStackTrace();
} catch (Te3Exception e) {
e.printStackTrace();
}
一种替代方法是读取因堆栈跟踪失败的方法:
final String failedMethodName = e.getStackTrace()[0].getMethodName());
另一答案
您可以执行以下操作:
try {
Main.te();
Main.te2();
Main.te3();
} catch (Exception e) {
System.out.println(e.getStackTrace()[0].getMethodName());
}
另一答案
在现实生活中,如果发生异常,您可能会在日志文件中写入一些内容。例如:
public class Driver {
// assuming slf4j
private static Logger logger = LoggerFactory.getLogger(Driver.class);
private static void te() throws IOException {
logger.error("exception happened in te()");
throw new java.net.SocketException("Connection Reset");
}
}
然后,要找出引发异常的方法,您只需要打开日志文件并检查。
以上是关于确定哪个方法引发异常的主要内容,如果未能解决你的问题,请参考以下文章