捕获异常并抛出相同的异常?

3

请问下面两个代码块中哪一个更好?

catch (MyException e) {
    throw new MyException ("Error processing request", e);
}

或者

catch (MyException e) {
    throw e;
}

1
你不是之前问过类似的问题,然后我们告诉了你如何使用try/catch/throw和throws,但是你的主题还是被关闭了吗?编辑:算了! - Dan
我会投票支持第一种方法。通常情况下,您可以捕获许多异常,将它们归纳为一个并抛出它.. 这样所有类似的异常都可以以相同的方式处理.. - TheLostMind
@DanPantry - 不是的.. 他不是那个人.. 那个家伙的声誉比较差(我想).. :P - TheLostMind
1
选项二是一个NOP。 - user180100
@RC. 的意思是,如果在此期间没有做任何其他事情,那么捕获并立即重新抛出相同的异常是没有意义的。您可以不捕获异常,让它自然传播。当然,如果您在 catch 块中还做了其他事情,可能有理由这样做。为什么不明确说明呢? - davmac
6个回答

4
为了比较两种方法,它们应该做同样的事情。这两种方法并不相同
第一种方法更好,因为您可以将其消息更改为更用户友好的消息。或许在重新抛出异常之前,您还可以记录它(stacktrace或其他)。
第二种方法在性能方面更好。实际上,如果您根本不捕获异常并让其自行抛出,效果会更好。
您必须根据用户体验和日志记录或性能选择哪种方法更可取。默认情况下(并非总是如此),我会选择第一种方法
希望能对您有所帮助!

1
我认为捕获异常并再次抛出没有意义。唯一的罕见情况可能是当发生异常时需要执行某些操作,同时将异常报告给调用者以采取适当的措施。
如果是这种情况,那么第一种方法更好,因为您只是再次抛出相同的异常(而不是创建一个新的异常对象)。顺便说一下,两种方法都会保留堆栈跟踪,只是第一种方法避免了创建不必要的对象。
例如:
catch (MyException e) {
  // May be perform some clean-up activity and throw
    throw new MyException ("Error processing request", e);
}

0

保留内部异常,我没有问题。虽然,我认为捕获然后重新抛出不太合理。肯定更好的做法是抛出一个自定义异常?


1
不,这很有道理。在您的函数中,您可以在不同的位置有5个不同的try-catch块来处理不同的异常(一个用于FileNotFound,另一个用于ArrayIndexOutOfBounds,另一个用于其他一些文件相关问题..)。现在,我们可以通过重新抛出通用的FileBasedException来处理FileNotFound和其他一些文件相关的异常..并通过重新抛出其他常见异常来处理arrayIndexOutOfBounds..这样,我们只需声明该函数抛出异常类别,并强制调用者进行所有思考... - TheLostMind
何必呢?在这种情况下,让异常自然传播就行了。如果你遇到AIOOB / 文件异常等,不应该在另一个异常中“隐藏”它 - 就让它在更高的层次上被捕获。 - Dan
我们并不是在隐藏...而是在概括它...我们可以为所有子类异常抛出父级异常,让调用者以同样的方式处理它们...这被认为是更好的方法... - TheLostMind
1
我能理解你的观点,但我认为像这样的异常情况应该被特别处理(如果预期会出现)或不予以概括处理(如果不是预期情况),因为其中一种异常情况表明出现了问题。然而,我也理解你的观点,并且我想这只是意见上的分歧,我们就此打住吧 :P - Dan
意见对意见,我同意 :P - TheLostMind

0
无论什么情况,您都可以保留StackTrace,没有问题。但它应该是有意义的,捕获和抛出相同的Exception没有任何意义。

0

如果您想在调用方法时包含任何其他有用信息,可以像第一种选项中那样包装原始异常。


0

第一个原因是,第二种方法(不进行任何处理重新抛出相同的异常)是无用的。

通常情况下,您需要在项目开始时定义异常处理。您将使用已检查还是未检查的异常?您将使用标准异常还是自定义异常?您将如何使用异常继承?您将在哪里处理(记录)异常?传递异常的信息是什么。一旦回答了这些问题,就可以开始构建您的API了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接