什么要包含在Exception的catch子句中

时间:2010-09-22 01:02:12

标签: java exception-handling try-catch

我有一个代码会抛出一堆异常,但每个异常只包含一个printStackTrace()方法,如下所示

} catch (SecurityException e) {
    // TODO Auto-generated catch block
    System.err.println(e);
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

这是否足够,还是需要包含System.err.println(e)等其他语句?通常,如果发生异常,我只能使用上述内容跟踪源。

5 个答案:

答案 0 :(得分:8)

如果有什么办法可以解决问题,可以在catch中执行,如果没有什么可以做,那么最好使用logging framework来注册异常而不是使用{{ 1}}或e.printStackTrace();

我个人建议:http://www.slf4j.org/,但如果你有自虐倾向,你可以尝试非常糟糕的(但官方的)Java Logging API:http://download.oracle.com/javase/1.4.2/docs/guide/util/logging/

SLF4J的一个额外优势是它可以将其日志记录重定向到糟糕的Java Logging API(这样您就可以使用设计优雅的API,并且仍然符合设计得非常好(法律上并非事实上)的“标准”

SLF4J易于使用,要记录异常,您只需编写System.err.println(e);,另一个优点是,每次应用程序时,您可以将其配置为send you an email崩溃(使用logback作为底层日志记录引擎)

答案 1 :(得分:1)

这取决于例外情况。显然,使用printStackTrace()将打印异常以供您调试(或用户向您报告)。但是没有额外的错误处理。

实施例: 如果抛出IOException,您可能希望向用户显示指定确切错误原因的错误消息,或者您可能希望对用户执行另一次透明操作。或者如果操作对整个任务的成功至关重要等等,你可能想要中止整个程序。

答案 2 :(得分:1)

如果要跟踪源e.printStackTrace()就足够了。 通常我把e.printStackTrace();放在DEBUG级别。另外,我在ERROR级别为用户添加了有意义的错误消息。

答案 3 :(得分:1)

我认为您可能会忽略异常和异常处理的基础知识。

例外的黄金法则是它们应该是例外。

这就是为什么你可能已经看过或读过你永远不会捕获基本异常的原因 - 你的代码根本无法处理每次异常。

因此,作为一般规则,如果您能够以特定方式处理异常,则应该只捕获异常。例如,如果您正在从文件中读取用户的详细信息但失败则可能会选择返回新用户。你不想做的只是捕获异常并记录它。这导致应用程序运行稳健,但只是吞下错误,导致极其糟糕的用户体验。

如果您的方法无法处理异常,则应该无法捕获它并将异常处理推迟到更高级别。这通常意味着将向用户显示错误消息(在顶层)。

答案 4 :(得分:0)

如果您有能力使用log4j之类的日志记录框架,您可以致电

}catch(Exception e){ log.error("Exception occurred:",e}

使日志框架记录您的自定义消息“发生异常”,然后记录错误日志文件中的堆栈跟踪