我正在捕获异常并使用ELMAH进行记录。
如果我没有捕获异常并让应用程序YSOD,则ELMAH记录完整的堆栈跟踪。但是,当我捕获并使用ErrorSignal.Raise(ex)
时,我没有得到堆栈跟踪。
我也试着无济于事:
ErrorSignal.FromCurrentContext().Raise(new System.ApplicationException(exception.ToString(), exception));
Whassup?
答案 0 :(得分:11)
您正在使用ErrorSignal.Raise
,而您只是new
了一个不为人知的例外情况。抛出异常时会填充堆栈跟踪,因此您的未知异常将不会有堆栈跟踪。另一方面,ELMAH将捕获你在这里包装的异常实例 - 如果你在调试器中查看它,它实际上将包含堆栈跟踪,这与包装异常不同。
而不是包装在System.ApplicationException中(顺便说一句,你最初应该inherited from,而现在是considered obsolete by the framework designers),你应该只提出你捕获的原始异常。
作为一个有趣的旁注:由于在抛出异常时填充了堆栈跟踪,所以:
catch (Exception ex) {
throw ex;
}
会破坏原始堆栈跟踪,而
catch (Exception ex) {
throw;
}
不会(后一位将发出保留原始堆栈跟踪的CIL rethrow
操作码。)
答案 1 :(得分:4)
这样做:
ErrorSignal.FromCurrentContext().Raise(
new System.ApplicationException(
exception.Message + exception.StackTrace, exception));