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

Xao*_*Bao 4 java exception try-catch

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

public void fxml() throws IOException
{
     // method body here
}
Run Code Online (Sandbox Code Playgroud)

或捕获方法内的异常

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

            try
            {
                fxmlLoader.load();
            } 
            catch (IOException exception) 
            {
                throw new RuntimeException(exception);
            } 
}
Run Code Online (Sandbox Code Playgroud)

从 Oracle 的例子来看,它说

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

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

所以我很好奇这是否意味着我们可能不需要该类/方法,并且通过在该方法中执行 try/catch,如果我们不使用它,它就没有任何作用,所以我们“扔掉它”以后用?

似乎类本身也会“抛出异常”以便稍后使用......它只是一个抛出层次结构,直到你最终可以使用它吗?在上面的教程中,几章后面有一章称为“链式异常”,这本质上是稍后使用的方法抛出的情况吗?

我还读过这个线程When to use throws in a Java method statements?

但我发现它并没有完全解释我想知道的事情,但是我发现了这种兴趣

如果您正在捕获异常类型,则不需要抛出它,除非您要重新抛出它。在您发布的示例中,开发人员应该执行其中一项操作,而不是同时执行两项操作。

通常,如果您不打算对异常执行任何操作,则不应捕获它。

您能做的最危险的事情就是捕获异常而不对其进行任何操作。

我不太确定他所说的“重新抛出”它是什么意思,除非他说的是抛出该方法并稍后捕获它?

然后他谈到,如果您不打算使用它,则不要执行任何异常操作,因此,如果我们需要它,似乎最好将其丢弃以供以后使用?

然后说它危险吗?为什么是这样?

因此,本质上,如果我们不知道是否要使用它,那么我们应该抛出它,以便可以调用方法本身,或者如果我们知道它将被调用,无论如何,那么我们应该尝试一下/捕获块?

我还注意到我的示例还引发了基于 IOException 的 RuntimeException。因此,从某种意义上说,您可以采用我们抛出的第一个方法,无论异常是什么,然后将其扔到 try 或 catch 块中?看起来 catch 块更适合“RuntimeException”或其他系统异常之一,但也许还有其他用例?

想法?

谢谢您的帮助!

chr*_*ke- 6

如果您的代码无法完成其工作(也称为“履行其合同”),您将引发异常。发生这种情况的原因可能是调用者向您传递了无效的输入,或者某些外部资源出现故障(例如网络连接丢失)。

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

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