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

时间:2013-01-01 18:02:47

标签: c# exception-handling

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

public static void ManageException(Exception ex,
                                   string customErrorMsg,
                                   bool displayMessage)

我想从一些catch块中调用。

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

我在某处读到了throw语句而没有任何参数。 throw语句(没有任何参数)在catch块中正常工作,但在我的ManageException函数中,它给出了编译错误:

  

不允许在catch子句

之外使用不带参数的throw语句

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

我正在使用C#2.0。

5 个答案:

答案 0 :(得分:6)

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

throw ex;

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

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


从您的评论中,如果您要做的是确定是否应该重新抛出异常,我建议:

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

    bool

答案 1 :(得分:1)

您的选择是:

一个。陷入困境:

try
{
    //do stuff
}
catch (Exception ex)
{
    ManageException(ex);
    throw;
}

B中。处理器方法中的Rethrow:

private void ManageException(Exception ex)
{
    //log or whatever
    throw new Exception("See inner exception", ex);
}

℃。处理更高层次:

    例如,在ASP.NET中使用Global.asax中的Application_Error事件处理程序方法     所有未处理的异常最终都可以在那里处理。

答案 2 :(得分:0)

你只能从catch区域内重新投掷。想一想;如果你不在catch块中,那么你的程序就会崩溃,或者异常被捕获到更高级别。从禁区外重新投掷毫无意义。

将你的函数包装在try / catch中,如果需要,可以从catch中重新抛出。另外,如果你正在做的所有事情重新投掷,那么没有意义;让异常泡沫起来。

答案 3 :(得分:0)

你做不到。

来自MSDN

  

可以在catch块中使用throw语句来重新抛出异常,该异常已被catch语句捕获。

如果要保留堆栈跟踪,则必须将其包装在InnerException

public static void ManageException(Exception ex, string customErrorMsg, bool displayMessage)
{
   ...
   throw new Exception ("Re-throwing", ex); // You can use your custom Exception object with custom message.
}

ManageException的来电者应该处理ex.InnerException而不是ex

答案 4 :(得分:0)

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

ExceptionDispatchInfo.Capture(exception).Throw();

自.NET Framework 4.5以来,ExceptionDispatchInfo类可用。

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