java中catch和catch和rethrow异常之间的区别?

时间:2015-05-13 05:01:47

标签: java exception-handling

我们可以通过try-catchthrow

抛出异常

情景1:

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

情景2:

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

在上面的代码块中

  1. 我们真的想抓住并重新抛出异常,而不是直接抛出异常吗?
  2. 哪种情况是处理异常的最佳方式?
  3. 如果方案2,请解释

6 个答案:

答案 0 :(得分:4)

方案2只有在您想要在抛出MyException时执行的代码时才有意义,例如你想记录那个例外。如果情况并非如此,则添加catch块并重新抛出异常是没有意义的。

答案 1 :(得分:2)

基本上需要抛出的是让编译器熟悉以下代码应该具有该类型的异常,以便在需要时处理它。 在这两种情况下,它完全依赖于业务需求,因为如果需要在自定义异常中包含任何Java标准的异常,则需要通过将其包装为具有业务解释的异常或基于参数进行不同的执行来处理它。异常。

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

答案 2 :(得分:0)

在方案2中,您可以通过捕获它来选择to do some work(例如将其包装到您的自定义异常中,执行一些簿记等),然后再将其抛出。但是如果你不处理异常而只是扔掉,那么IMO都是相同的。

答案 3 :(得分:0)

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

但是你仍然可以为其他异常类型设置一个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)
    }
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

场景2的用法

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

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