我有一个常见的异常处理函数:
public static void ManageException(Exception ex,
string customErrorMsg,
bool displayMessage)
我想从一些catch块中调用。
处理异常后,我想重新抛出异常,同时保留堆栈跟踪。
我在某处读到了throw
语句而没有任何参数。 throw
语句(没有任何参数)在catch
块中正常工作,但在我的ManageException
函数中,它给出了编译错误:
不允许在catch子句
之外使用不带参数的throw语句
是否有任何解决方案可以使用ManageException
函数从整个堆栈跟踪中重新抛出异常而不会对性能产生任何影响?
我正在使用C#2.0。
答案 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)将异常包装在另一个异常中。