如果捕获空指针异常不是一个好的做法,那么捕获异常是一个好的做法吗?

我听说捕捉是一种不好的做法,我认为这是明智的。让 传播到顶部将允许检测出错的地方。但是很多时候,我看到我的许多朋友直接捕获,这样他们就不必为上述代码中可能发生的所有不同类型的异常而烦恼。这是一种很好的做法吗?还有哪些其他类型的例外情况最好不予处理?此外,对我来说,处理特定代码也是有意义的,我们确信异常的来源。那么,什么时候应该处理异常,什么时候不应该处理它们呢?最好不予处理的可能的异常列表是什么?NullPointerExceptionNullPointerExceptionExceptionNullPointerException


答案 1

口袋妖怪异常处理很糟糕。特别是,如果它是一个空块,你只是吞下它们。你有专门类型的异常,因为它们实际上意味着特定上下文中的特定事物(本质上它们告诉你出了什么问题)。因此,通过捕捉,你是在说你不在乎这些例外是什么,你不在乎发生了什么。这可能不是你想要的。Exception

通常,在捕获异常时,请遵循以下规则:

  • 在此级别处理异常是否有意义?如果是,则处理它。如果不是,则进行传播。
  • 结合第一条规则,“处理”也可以表示,捕捉,包装和重新投掷。这是一种防止抽象泄漏的方法,以便方法的调用方不必了解基础实现。
  • 空的 catch 块并不意味着您已经处理了异常。这就是所谓的“吞咽”;至少,您希望记录异常。有时,发生的异常实际上是代码逻辑流的一部分,因此您可能希望做一些特殊的事情(但这是,请原谅双关语,例外而不是规则。最好检查导致异常的情况,而不是将它们合并到代码的逻辑流中)。

您可以轻松检查代码中的空值,因此无需显式捕获空指针异常。让事情发生是没有意义的(这是不好的做法)。即使您有一些代码抛出 ,并且该代码不受您控制且无法修复,您也应该确定导致这些参数并专门针对它们进行测试的输入参数。NullPointerExceptionNullPointerExceptionNullPointerException

您不应捕获的另一个例外是 .此异常意味着您传入了一个没有意义的参数。不应捕获此异常,而应显式测试输入参数,以确保它们是正常的,并且它们不会导致 .IllegalArgumentExceptionIllegalArgumentException


答案 2

捕捉被认为是一种不良做法的“原因”并不是因为你应该在出现问题时让它冒泡!仅仅根据其类型说任何例外都是“最好不处理”似乎是一个坏主意。NullPointerException

NPE 被视为编程错误的结果。严格正确的程序永远不应该生成一个。看到它被抓住的原因是它通常意味着代码扔了一个,程序员决定只是抓住它并掩盖它,而不是修复首先导致它的损坏代码!

例如,如果出于业务原因,您与一个内部有 bug 的 API 耦合,并且偶尔会抛出一个空指针,那么捕获它、对它执行某些操作/用更好的消息通知用户是完全合法的。仅仅因为有人说“捕获空指针异常不好”就让“null”命中UI是没有意义的!

在特定情况下,捕捉可能是合法的,但通常“我很懒”不是其中之一。:)例如,如果您正在实现一个 API,并希望绝对确保没有不在规范中的异常,则可以捕获 Exception 并将其包装在您定义的某个应用程序异常中。java.lang.Exception


推荐