JUST在捕获中"抛出"是否有益处?

And*_*ewD 17 .net c# vb.net

与一位同事进行了一场激烈的辩论,讨论他在try/catch中包装他的大部分功能的做法,但是抓住它只是一个"抛出",例如

Private sub foo()
    try
        'Do something'
    catch
        throw 'And nothing else!'
    End Try
End Sub
Run Code Online (Sandbox Code Playgroud)

我的想法是甚至不打扰(假设你此时不需要做任何事情) - 异常会冒泡到父成员中的下一个异常处理程序.

听起来似乎有道理的唯一论点是,有时异常没有被捕获并且您的代码停止了(在调试模式下),当前行以绿色突出显示...并且这可能与多个线程有关?最佳实践会声明"每个线程的异常处理程序",但大多数情况下我们使用单线程.

好处可能是它在调试模式下可能有用而不会突然弹出到父成员(是的,Joel!) - 你将转到"throw"语句并能够检查你的本地人.但是那么你的代码将"乱七八糟地尝试/捕获/抛出"(在这里引用另一个线程)?

如果没有异常发生,那么在任何地方添加try/catch/throws会涉及什么样的开销(即你应该避免在紧密循环中尝试/捕获)?

Jan*_*Jan 18

Microsoft建议您不要捕获异常,因为您唯一要做的就是立即重新抛出它(我现在不记得源代码).您的代码应该只捕获您要处理清除事务或类似操作的异常.

因此,捕获和重新抛出异常通常不是一个好习惯.

用另一个例外捕获和替换它的原因可能是

  • 记录
  • 隐藏来自调用者的敏感信息(Stacktrace,异常详细信息)

对于调试,您可能希望更改"异常时间中断:" - 处理程序(按Ctrl + Alt + e)在所选CLR异常上"抛出"的值.

您可能希望查看entlib异常处理程序块(EHB),使用该块可以建立关于如何处理代码中的异常的模式.

关于你的性能问题,我认为在你的代码中有许多try/catch块并不是一个问题,但是当你的代码引发并捕获许多异常时,你会得到性能命中.


Joe*_*orn 17

您在catch中单独抛出而不是抛出新异常的原因是因为这会导致保留原始堆栈跟踪/异常数据.您可能会这样做的一个原因是因为您现在可以在那里设置一个断点来进行调试.


Jon*_*eet 8

我只会在调试问题时执行此操作 - 并且在签入之前我会再次删除代码.如果抛出异常,有时可以将断点放在特定堆栈级别停止.除此之外 - 没有.


Geo*_*off 6

在实践中,我的想法是,如果你不打算处理错误,不要抓住它.