繁体   English   中英

确定哪个方法抛出异常

[英]Determining which method throws exception

下面的代码捕获一个IOException ,第一个抛出的异常将被捕获。 确定哪个方法抛出IOException是将每个抛出IOException方法包装在 try catch 块中的唯一解决方案? 我问,因为我计划的解决方案添加了很多 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。但是如果错误处理相同,那么您的代码就可以了(除了通常,您将堆栈跟踪打印到日志文件中)并且您将能够通过读取堆栈跟踪来找出哪个方法引发了异常作为人类用户。但是如果错误处理相同,那么您的代码不需要知道哪个特定方法引发了异常。

我不知道你为什么要做这样的事情,当然真实的情况会远离这个代码片段,但是,在“现实生活”中,我会考虑扩展 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");
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM