我们何时应该在方法中抛出异常或捕获异常?

时间:2015-10-14 23:48:33

标签: java exception exception-handling try-catch

我一直在阅读有关异常的更多内容,但我不确定在什么情况下我们应该抛出一个方法

public void fxml() throws IOException
{
     // method body here
}

或在方法中捕获异常

public void fxml()
{
          FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml.fxml"));

            try
            {
                fxmlLoader.load();
            } 
            catch (IOException exception) 
            {
                throw new RuntimeException(exception);
            } 
}

从Oracle的例子中可以看出

  

有时,代码可以捕获可能发生的异常。但是,在其他情况下,最好让调用堆栈中的方法进一步处理异常。例如,如果您将ListOfNumbers类作为类包的一部分提供,则可能无法预测包的所有用户的需求。在这种情况下,最好不要捕获异常并允许进一步调用堆栈的方法来处理它。

     

https://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html

所以我很好奇,如果这是说我们可能不需要类/方法,并且通过在此方法中执行try / catch,如果我们不使用它就不会有用,所以我们“抛出它“以后用?

似乎类本身也“抛出异常”以便以后使用...它是否只是一个抛出的层次结构,直到你最终可以使用它?在上面的教程中,后面的几章后面是一个名为“链式异常”的章节,这个基本上是什么方法会抛出以后使用的方法?

我也读过这个帖子When to use throws in a Java method declaration?

但是我发现它并没有完全解释我想知道什么,但是我发现了这个兴趣

  

如果要捕获异常类型,则不需要抛出它,除非您要重新抛出它。在您发布的示例中,开发人员应该完成一个或另一个,而不是两个。

     

通常情况下,如果你不打算对异常做任何事情,你就不应该抓住它。

     

你可以做的最危险的事情是抓住一个例外而不做任何事情。

我不确定“重新抛出”它的含义是什么,除非他在谈论抛出方法并在以后捕捉它?

然后他谈到如果你不打算使用它就不会做任何异常的事情,所以如果我们需要的话,似乎把它丢弃以供以后使用?

然后谈论危险吗?这是为什么?

所以基本上如果我们不知道我们是否会使用它,那么我们应该抛出它以便可以调用方法本身,或者如果我们知道它将被调用,无论如何,那么我们应该做一个try / catch块吗?

我还注意到我的示例还会基于IOException抛出RuntimeException。所以从某种意义上说,你可以采用我们抛出的第一个方法,无论如何,然后将它扔到try OR catch块中?似乎catch块更适合“RuntimeException”或其他系统异常之一,但也许还有其他用例?

思想?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

如果您的代码无法完成其工作(也称为"履行合同"),则会抛出异常。这可能是因为调用者传递了无效输入,或者某些外部资源出现故障(例如网络连接丢失)。

当您可以以某种方式处理下游的预期问题时捕获异常。例如,您可能会捕获指示网络问题的异常并重试操作几次,或者您可能会向用户显示错误消息并询问下一步该做什么。

如果下游代码可能会抛出异常,但您的代码位于中间某个位置并且不知道该怎么做,那么只需让异常移动到调用代码即可。