正确捕捉异常

时间:2015-03-09 13:42:57

标签: java exception-handling

我通常倾向于不捕捉“异常”,但只有我希望方法抛出的例外情况,我经常听到这是很好的做法。 但是今天我遇到了这个问题,方法IllegalArgumentException引发了URLDecoder.decode(string,encoding)。 此方法声明为:

public static String decode(String s, String enc)
    throws UnsupportedEncodingException{.....

然后它('如果你看一下来源')在三个不同的地方抛出IllegalArgumentException。 所以我对更有经验的程序员的问题是,我会抓住“例外”吗?或者这个方法是否被错误地声明了? 谢谢

4 个答案:

答案 0 :(得分:1)

不,你不应该抓住那些例外。 IllegalArgumentException表示先决条件失败。它通常是由程序中的错误引起的,应该会导致应用程序崩溃。如果输入来自用户,请检测错误的输入并显示重要消息。

如果您的应用程序中有异常处理策略,那么您可以让这个异常冒出来。

答案 1 :(得分:0)

Java中有两种主要的异常类型,即声明的异常(例如UnsupportedEncodingException)和您不必捕获的运行时异常(例如IllegalArgumentException)。但是,如果您没有捕获Runtime异常,它将使您的线程崩溃并可能崩溃整个应用程序,因此它取决于您的用例。当我使用多个线程构建大型应用程序并同时执行多项操作时,当我调用'不可预测'的方法(如'decode')时(特别是任何接受用户输入的内容,或从我不负责的文件中读取等)我喜欢捕获异常,因此我可以记录一个很好的干净错误或向用户返回一个有意义的错误,但我的应用程序的其余部分继续正常运行。但是,如果我正在编写一个运行它的单线程应用程序,提供一些输入,并且它提供了一些输出,我不会理会捕获运行时异常,因为输出和堆栈跟踪将打印到控制台,我可以确切地看到问题是 - 并且应用程序死了并不重要,因为我可以解决问题并再次运行它。

仅仅是我个人的偏好 - 希望有所帮助!

答案 2 :(得分:0)

在Java中存在两种例外,已检查未经检查例外,以下是不同之处:

  • 未经检查的异常:它们的继承树中有RuntimeException。编译器不要求你明确地捕捉它。
  • 已检查的异常:它们的继承树中没有RuntimeException。你必须在一个抛出clausule中的try-catch块声明中捕获它。

基本上根据所有开发方法,您的代码必须经过测试,您必须涵盖可能发生未经检查的异常的所有情况,因为它们是由逻辑代码中的错误或API的错误使用生成的,您必须更正它们。这就是为什么在最终的代码中它们永远不会被捕获,因为它们永远不会发生。

另一方面,检查的异常可能由与您的代码逻辑无关的原因发生,即网络松散,文件系统特权的变化等等。因此,您应该准备好代码以准备好并捕获或委派异常。

我希望它有所帮助。抱歉我的英文

答案 3 :(得分:0)

如果你看一下decode(String s, String enc)的来源,你会看到三个地方IllegalArgumentException投掷:

所有三个错误都是使用错误,但输入中存在真正的错误。因此,IllegalArgumentException不是检查异常是正确的。

正确,UnsupportedEncodingException是已检查的例外。来电者可以处理它。

回答你的问题:尽可能具体地说明你所捕获的内容。不要只抓住Exception因为你没有简单的方法来决定如何继续。您可以在不同的 UnsupportedEncodingException块中捕获IllegalArgumentExceptioncatch。您必须抓住UnsupportedEncodingException