【问题标题】:Java catch exception design and performanceJava catch 异常设计与性能
【发布时间】:2016-01-14 16:09:01
【问题描述】:

我想了解一些关于捕获异常的知识。

如果我不希望我的应用程序在发生异常时崩溃并且不知道会抛出什么异常,那么我在代码中处理异常的方式是这样的:

public static void main(String[] args) {
try {

    // all my code to new StarGAte with a lot of threads and classes

} catch (Exception e){

    //Something went wrong (kill the dev!)
    } 
}

try/catch 块在我的代码中是否存在任何性能问题? 有没有更好的方法来处理异常?

【问题讨论】:

  • 这里的问题是测试,而不是性能。您需要测试中的堆栈跟踪,因为它可以准确地向您显示错误的位置。构建完整的应用程序后,可以在根目录下添加一个 catch (Throwable x),这样您就可以捕获(并报告)任何意外异常。
  • 小心线程。此代码不会发现单独线程中的异常。您必须将 Thread 内部封装在类似的 try/catch 中,或者使用 Thread.setDefaultExceptionHandler() 来捕获每个 Thread 异常。

标签: java exception


【解决方案1】:

使用 try/catch 覆盖我的所有代码是否存在性能问题?

没有。如果没有抛出异常,则永远不会运行异常处理代码。

有更好的方法来进行设计异常处理吗?

不要捕获Exception,除非您调用的方法实际抛出 Exception。捕获特定已检查的异常,如果您想确定,请捕获RuntimeException

【讨论】:

  • 我没有足够的经验知道会抛出哪些异常。 RuntimeException 就够了吗?
  • @Smiled_One 不用担心,编译器会告诉您是否需要捕获特定的异常类型:如果您不处理您需要的异常,这是一个编译时错误。
  • 谢谢。我会这样做并搜索 Thread.setDefaultExceptionHandler()
【解决方案2】:

异常只能用于错误处理。因此,它们应该很少在您的代码中执行,并且它们的性能在大多数情况下都是可以接受的。

这里有一些处理异常的技巧,取自我的帖子Exceptions Guidelines

不要捕获顶级异常

不要直接在您的 API 中捕获顶级异常类,例如 Throwable、Exception 或 RuntimeException,除非您确实知道自己需要这样做并且您处于代码库的最顶层(您的主要方法和顶层服务器/守护程序代码)。这些异常类包含许多无法安全处理的不可恢复异常。对于 Throwable 类尤其如此,它还捕获 JVM 可能抛出的错误异常,例如内存不足异常。捕获这些异常并继续运行您的应用程序可能会导致数据损坏和未定义的行为。

确保您的 catch() 语句从最具体到最一般的顺序正确。您可以使用 multi-catch 语句对需要进行相同处理的异常进行分组,例如记录错误:

catch( Exception1 | Exception2 | Exception3 e) {
    logger.log( "Bad Exception: " + e.getMessage(), e );
}

如果可以以相同的方式抛出和处理多个异常,请使用公共父级。例如捕获 IOException 会自动捕获 FileNotFoundException,因为它继承了 IOException 形式。

避免捕获 Throwable 类!当您开始捕获不可恢复的 JVM 异常时,就会发生不好的事情。

不要对流控制使用异常

它会减慢您的代码并使其难以维护。算是很bad practice.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多