我正在尝试使用try...catch
块中处理的Elmah异常进行记录。
我在Global.axax
上添加了一个全局句柄错误过滤器:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new ElmahHandledErrorLoggerFilter());
filters.Add(new HandleErrorAttribute());
}
这是我的ElmahHandledErrorLoggerFilter
:
public class ElmahHandledErrorLoggerFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
if (context.ExceptionHandled)
ErrorSignal.FromCurrentContext().Raise(context.Exception);
}
}
它只会记录try{ ... }catch{ throw new Exception(); }
中的异常。但这不是问题,问题是我有一个带有try-catch的方法,该方法已经在另一个try-catch中的代码中调用。在这种情况下,虽然我将throw new Exception()
放在内部方法的catch中但它不记录异常,但它会在第一个方法中返回catch而不记录Exception。例如:
public void MainMethod()
{
try
{
SecondMethod();
}
catch
{
....second method jump here.....
}
}
public void SecondMethod()
{
try
{
int a =0;
int b =;
int result = b/a;
}
catch
{
throw new Exception();
}
}
Elmah没有记录SecondMethod
抛出的异常。它回到主要方法catch。如果main方法catch也有throw new Exception()
代码,那么它会记录异常。但是,它将被记录,堆栈跟踪指向MainMethod
而不是SecondMethod
。
我想要的是每当它到达一个捕获而不重新抛出新的异常时,Elmah会记录异常。这是因为我的应用程序中有许多try-catch块,我想记录这些异常,而无需手动登录每个try-catch。但是,如果你告诉我如何从SecondMethod
中记录那个没问题的例外。
答案 0 :(得分:1)
您使用的是ASP MVC吗?
过滤器仅针对从控制器方法抛出的未处理异常执行。 (context.ExceptionHandled
属性告诉您它是否已由另一个过滤器处理,而不是在try-catch块中处理。因此,如果您在方法中吞下try-catch块中的异常,那么错误过滤器将不会处理它们。
您需要决定何时使用try-catch块手动处理代码中的异常(在这种情况下,借助基本控制器类或帮助程序类手动记录异常)或让异常气泡并由您的过滤器处理。 (根据每个特定用例,您可能需要两者的混合)
当您决定重新抛出异常时,请查看this SO question。基本上,您可以使用以下命令重新抛出保留堆栈跟踪的异常:
try
{
//code
}
catch (Exception ex)
{
//...some error handling code here...
//Otherwise why the try-catch at all?
throw;
}
您可以在示例MainMethod
中执行此操作,并且记录的异常将保留堆栈跟踪。