代码之家  ›  专栏  ›  技术社区  ›  Cameron Tinker

尝试捕获并重新抛出异常

  •  1
  • Cameron Tinker  · 技术社区  · 12 年前

    前几天,我在我们的一个项目中看到了一些代码,这些代码使用try-catch并像这样重新抛出捕获的异常:

    try
    {
        exceptionProneCode();
    }
    catch(Exception ex)
    {
        throw ex;
    }
    

    没有对catch块中的异常执行任何其他操作,所以我甚至不确定为什么要重新抛出它。我看不出再次抛出相同的异常而不处理该异常有什么好处。

    如果您重新抛出一个在catch块中捕获的异常,那么C#是如何处理的?它会陷入无限的投掷/接球循环吗?还是它最终会离开试跳?

    4 回复  |  直到 12 年前
        1
  •  11
  •   Alireza    12 年前

    考虑这两种模型:

    1-通过重新- throwing ex :

    catch(Exception ex)
    {
        throw ex;
    }
    

    你松了 StackTrace 。如果 exception 记录在 堆栈跟踪 包含调用堆栈的即时帧(方法调用的历史记录)丢失。

    2-相比之下 throw :

    catch(Exception ex)
    {
        // do something here
        throw;
    }
    

    你坚持 堆栈跟踪 。您可以进行额外的处理,然后重新抛出 例外 而不会松开跟踪字符串。

        2
  •  4
  •   heavyd    12 年前

    它继续将异常抛出调用堆栈。这段代码所做的一件事与没有捕获异常不同,它会将异常位置(调用堆栈、行号等)重置为重新抛出异常的位置,这样就不会有原始异常的抛出位置。

    如果你真的不打算在接球区做什么,我建议你不要接球,或者至少用一个 throw 而不是 throw ex .

        3
  •  2
  •   Mike Perrenoud    12 年前

    它将异常抛出给调用者。但它在这里处理它,这样就不会抛出未处理的异常。然而,老实说,我看不出这有什么好处。就让它抛出异常。为什么?因为异常只是 未处理的 如果上面的整个调用堆栈没有 try ... catch 。这没有做任何有用的事情。

        4
  •  1
  •   MatthewMartin muthu    12 年前

    它会被无限次投掷/接球卡住吗 环还是它最终会离开试跳?

    没有。是的。

    正如其他人所指出的那样,该代码对调试没有任何好处,反而有害。

    一个好的catch块将捕获特定的预期问题并记录&继续(该问题并不表明应用程序状态已损坏),记录并停止(因为应用程序现在处于未知状态,继续可能会造成更大的伤害),做其他事情(例如,回到等效的技术/算法),等待并重试。

    默认情况下,应该记录意外情况,并停止应用程序——要么放弃页面,要么如果是winforms应用程序,尽可能恢复到已知状态。