确定哪个方法引发异常

时间:2019-12-24 15:37:55

标签: java

下面的代码捕获了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();
        }
    }

}

5 个答案:

答案 0 :(得分:1)

答案取决于您所需的逻辑。如果根据引发异常的方法对异常的处理方式有所不同,(这意味着在catch中,您需要根据引发异常的方法编写不同的错误处理代码,那么您确实需要包装每个方法调用进入单独的try-catch中。但是,如果错误处理相同,则您的代码就可以了(除非通常,将您的stacktrace打印到日志文件中),并且您可以通过读取stacktrace找出哪个方法引发了异常但是,如果错误处理相同,则您的代码不需要知道哪个特定方法引发了异常。

答案 1 :(得分:1)

我不知道您为什么要这样做,并且实际情况肯定会与这段代码片段相去甚远,但是,在“现实生活中”,我会考虑扩展IOException :您将在main方法中进行一次尝试,其中包含三个捕获。你喜欢这个解决方案吗?

答案 2 :(得分:1)

为每个方法创建一个自定义异常:

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());

答案 3 :(得分:1)

您可以执行以下操作:

try {
    Main.te();
    Main.te2();
    Main.te3();
} catch (Exception e) {
    System.out.println(e.getStackTrace()[0].getMethodName());
}

答案 4 :(得分:0)

在现实生活中,如果发生异常,您可能会在日志文件中写入一些内容。例如:

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");
    }
}

然后,要找出引发异常的方法,只需打开日志文件并检查。

相关问题