gpt4 book ai didi

Java - 应该在哪里以及如何使用异常?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:51:51 25 4
gpt4 key购买 nike

我正在阅读一些有关 Java 中异常处理的内容,以便能够编写更好的代码。好吧,我承认,我有罪;我使用了太多的 try-catch{} block ,我在捕获中使用了 ex.printStackTrace(),甚至没有使用适当的记录器(实际上是 System.outSystem.err 被重定向到 PrintWriter,因此生成了日志)。然而,经过几个小时的阅读,我发现自己置身于一个陌生的地方:未知。如果异常旨在传递有关异常流状态的信息,那么人们如何知道在何处使用该信息做某事的适当级别?

比如,当数据库发生错误时,是应该返回空值还是返回错误码,还是抛出异常?如果抛出,应该在哪里处理该异常?我知道如果您对此无能为力,那么即使记录异常也没有用。但是,在 GUI 应用程序中,这很容易杀死您的 GUI(我正在使用 SWT,我经常看到这种情况),即使对于 menuShown() 方法(ArrayIndexOutOfBounds 异常将关闭应用程序,如果不处理)。这个例子可以一直持续下去,但这里是问题的总结:

  1. 过度使用 try-catch() 是否会对性能产生负面影响?
  2. 使用特定的异常类型是否更好?如果我错过了一个怎么办可能发生的 X 种异常类型?
    坦率地说,在 2-3 年内,我听说过并使用了 10% 的 Java 标准异常。是的,有人说如果调用者不知道如何处理抛出的异常,他不应该有调用抛出方法的权利。对吗?
  3. 我读过 AndersHejlsberg 的这篇文章,说检查异常是不好的。这是否表明在某些情况下建议方便的异常吞噬?
  4. 一张图片胜过1000字;我想一些例子会有很大帮助在这里。

我知道这个主题是永恒的,但实际上我很期待使用您的建议来审查一个 150 类的中型项目。非常感谢。

最佳答案

异常的一般经验法则是,如果你能对它做点什么,就捕获它并处理它,如果你不能,就把它重新扔给下一个方法。要了解您的一些细节:

  1. 不会,使用过多的 try/catch 不会对性能产生影响
  2. 尽可能使用最具体的异常(exception)类型。例如,如果可以避免,通常不应抛出 Exception。通过抛出特定类型,您让用户知道什么地方可能出错。但是,您可以将它作为更通用的东西重新抛出,这样不关心特定异常的调用者就不需要知道它(例如,GUI 不会关心它是 IOException 还是 ArrayIndexOutOFBoundsException)。
  3. 你会发现人们更喜欢检查异常,你会发现人们更喜欢未检查异常。一般来说,我尝试使用未检查的异常,因为对于大多数已检查的异常,您通常无能为力,而且您仍然可以处理未检查的异常,只是没有必要。我经常发现自己会重新抛出已检查的异常,因为我对它们无能为力(另一种策略是捕获已检查的异常并将其作为未检查的异常重新抛出,因此如果链中较高的类不需要,则不需要捕获它).

我通常喜欢在捕获异常时记录异常 - 即使我对此无能为力,它也有助于诊断问题。如果您不熟悉它,还可以查看 Thread.setDefaultUncaughtExceptionHandler 方法。这允许您处理未被任何人捕获的异常并对其进行处理。这对于 GUI 应用程序特别有用,因为否则可能看不到异常。

进入一些例子:

try {
// some database operation
}
catch (IOException ex) {
// retry the database operation. then if an IO exception occurs rethrow it. this shows an example doing something other than just catch, logging and/or rethrowing.
}

如果您愿意,我很乐意扩展其中的任何部分。

关于Java - 应该在哪里以及如何使用异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1515075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com