抛出没有参数的语句,在常见异常处理程序中的catch块之外

All*_*ons 3 c# exception-handling

我有一个常见的异常处理函数:

public static void ManageException(Exception ex,
                                   string customErrorMsg,
                                   bool displayMessage)
Run Code Online (Sandbox Code Playgroud)

我想从一些catch块中调用它.

处理异常后,我想重新抛出异常,同时保留堆栈跟踪.

我在某处读到了我应该throw声明没有任何参数.该throw声明(没有任何PARAMS)在正常工作catch块,但在我的ManageException功能,它给了我一个编译错误:

不允许在catch子句之外使用不带参数的throw语句

是否有任何解决方案可以从整个堆栈跟踪中重新抛出异常而不会对ManageException函数产生任何性能影响?

我正在使用C#2.0.

Mik*_*oft 8

如果确实需要在catch块之外重新抛出异常,可以使用以下方法:

ExceptionDispatchInfo.Capture(exception).Throw();
Run Code Online (Sandbox Code Playgroud)

ExceptionDispatchInfo自 .NET Framework 4.5 起可用。

通常,您不需要使用此方法;相反,您可以 a) 使用 catch 块内的命令重新引发异常throw;,或者 b) 将异常包装在另一个异常中。


lc.*_*lc. 6

您必须指定要抛出的异常,如:

throw ex;
Run Code Online (Sandbox Code Playgroud)

如您的错误中所述,您只能throw;从catch块中重新抛出异常(with ).恕我直言,这是唯一有意义的地方; 你要么抓住异常,要么扔掉它,也许不应该两者兼顾.从一个叫做的方法ManageException,我想知道你为什么要管理所述异常,但无论如何都要抛弃它.

也许您想要将原始异常包装在您自己的异常中,提供其他详细信息?在这种情况下,我会抛出一个新的异常与ex作为InnerException,如果要保留这些数据.


根据你的评论,如果你要做的是确定你是否应该重新抛出异常,我会建议:

  • 将您的方法重命名为TryManageException并更改签名以返回bool- 如果未正确管理异常并且需要重新抛出,则返回false; 如果处理则返回true.
  • 如果该方法返回false(=未管理),则从catch块重新抛出或执行您需要的任何其他操作:

    try
    {
        decimal oops = 5 / 0;
    }
    catch (Exception e)
    {
        if (!CommonExceptionHandler.TryManageException(e, "oops", "oops"))
            throw;
    }
    
    Run Code Online (Sandbox Code Playgroud)