确定哪个方法引发异常

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

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

以上是关于确定哪个方法引发异常的主要内容,如果未能解决你的问题,请参考以下文章

从 tweepy 异常实例中获取错误代码

导航抽屉中的谷歌地图 - 空指针异常,哪个是正确的片段?

调用 new(堆)后由意外的汇编代码引发的异常

C# 捕获堆栈溢出异常

引发类型为“System.OutOfMemoryException”的异常

27.异常