猿问

Java 程序中的异常处理

这是我的程序结构:

主函数 -> 调用 A 类 obj -> A 类调用 B 类 obj

在异常处理方面,如果在 main、A 类或 B 类中遇到异常,我想以错误代码退出程序。

目前,我正在做我认为是一个繁琐的过程(并且可能是一种愚蠢的方式):

-> 在 A 类和 B 类的函数中进行异常处理。

-> 如果函数中发生异常,让函数退出并返回一个被视为“错误”的值(例如特定值或布尔值 false)。

-> main 有自己的 try/catch,但对于 A 类和 B 类的每个函数调用,如果返回是 'error',它会抛出异常,然后以错误代码退出。

我对这种方法的争论是(a)我可能多次抛出和处理异常(在类级别,然后在主级别)。(b) 如果假设类中的函数返回一个值,那么我必须留出一个特定值,当接收到该值时,应该将其解释为错误。

任何更清洁的建议?这适用于将被编译为从命令行作为可执行 JAR 运行的程序,并且不会是微服务(或基于 Web 服务器 - 对于那些,我认为,而不是退出程序,您会在日志中报告错误并继续)。


紫衣仙女
浏览 178回答 3
3回答

牧羊人nacy

您应该遵循的基本思想是拥有这样的main方法:public static void main(String... args) {    try {        new A().run();    } catch (ExitProgramException e) {        System.exit(e.getCode());    }}目前还没有预定义ExitProgramException。这很好,因为否则其他一些类可能已经抛出它。但是,在这种情况下,您希望定义可以引发此异常的所有位置。异常类应定义如下:public final class ExitProgramException extends RuntimeException {    private final int code;    public ExitProgramException(int code) { this.code = code; }    public int getCode() { return code; }}现在,在 A 类和 B 类中,您可以throw new ExitProgramException(1),并且一切都会按预期工作。由于extends RuntimeException,中间代码不必知道这个异常,并且会很高兴地让它冒泡,从类 B 到类 A 回到main方法,最终被捕获并转换为退出代码。

跃然一笑

一般来说,只有在以下情况下才值得捕获并重新抛出异常:您将抛出不同类型的异常(更适合方法提供的抽象,通常包装原始异常),和/或你想要一些副作用(例如在某处记录错误,或者一些不适合finally { }块的清理)。如果你没有做任何这些,那么就选择简单的方法,不要捕获异常。但是请务必在方法的 JavaDoc 中提及它,即使它没有被选中。正如其他人所说,返回专门的错误代码在 Java 中很少是一个好主意。它们罗嗦,容易忘记,并且不会传播给调用者。并且返回一个特殊值(例如null)来代替正常的返回值更糟糕!例外是标准的方式,这是每个人都会期待的。

MYYA

Java 中的异常之处在于,它们在语义上做了很多不同的事情代码错误:如 NullPointerException 或 SQLExceptions 等异常,您的 SQL 不正确。这些(IMO)不应该被捕获,或者应该作为错误重新抛出并在 uncaughtExceptionHandler (您可以在 Thread 中定义)中捕获用户错误:NumberFormatException 等异常和错误表单数据异常,其中用户输入了无效值。这个(IMO)应该在他们应该更正值的地方附近有一条消息来处理正常的、预期的异常:IOException / SocketException 等异常。InterruptedException 也在这个家族中。这些例外是你的朋友(!),因为他们解锁了正在等待他们应该等待的东西的线程。它们是连接到 IO 资源的正常周期的一部分。因此,如果套接字关闭,您可以在某处记录异常(有时甚至没有必要),并可能询问用户是否要重新打开连接。
随时随地看视频慕课网APP

相关分类

Java
我要回答