java 中 catch 与 catch 和重新抛出异常的区别?

Difference between catch vs catch and rethrow exception in java?

我们可以通过try-catchthrow

抛出异常

场景一:

public void testMethod() throws MyException
{
   throw new MyException();
}

场景二:

public void testMethod() throws MyException
{
   try
   {
      throw new MyException();
   }
   catch(MyException e)
   {
      throw e;
   }
}

在上面的代码块中

  1. 我们真的要捕获并重新抛出异常而不是直接抛出异常吗?
  2. 哪种情况是处理异常的最佳方式?
  3. 如果是场景2,请说明

在场景 2 中,您可以选择 to do some work 捕获它(例如,将其包装到您的自定义异常中,做一些簿记等),然后再进一步抛出它。但是,如果您不处理异常而只是抛出异常,那么 IMO 两者都是相同的。

场景 2 只有在您希望在抛出 MyException 时执行的代码才有意义,例如你想记录那个异常。如果不是这种情况,那么添加 catch 块并重新抛出异常是没有意义的。

由于您正在抛出 MyException,因此您不必真正捕获它并重新抛出它,除非您需要在捕获中执行一些日志记录或任​​何特定任务。

但是您仍然可以为其他异常类型设置一个 catch 块,然后用 MyException 包装这些异常。这将使您清楚地了解异常踪迹。

例如:

public void doSomething() throws MyException {
    try {
        throw new MyException("Some Message");
    }
   catch(MyException e) {
      // Only IF YOU NEED TO EXPLICITLY LOG IT OR HANDLE IT.
       throw new MyException("A Message of failure",e)
    }
    catch(SomeOtherException e) {
      // LOG or HANDLE IT.
       throw new MyException("A Message of failure",e)
    }
}

如果你想抛出自定义异常而不是实际异常,那么你应该在 catch 中抛出异常,但如果你在 catch 中抛出相同的异常,那是没有用的。

场景 2 的用法

案例 1:摆脱已检查的异常,即 throws MyException 子句并抛出 RuntimeException

情况 2:在将异常重新抛出堆栈之前记录或调用某些警报服务等

基本上 throws 的需要是告知编译器以下代码预计会有那种类型的异常,以便在需要时处理它。 在这两种情况下,它都完全取决于业务需求,因为如果需要将任何 Java 标准的异常包装在自定义异常中,您需要通过将其包装为具有业务解释的异常来处理它,或者进行不同的处理根据异常的参数执行。

在场景 2 中,无需重新抛出它,直到需要明确抛出它以执行任何进一步的代码流,而不是将其留给编译器。 希望这对您有所帮助!