C# 在try..catch with Elmah中处理的日志异常
我正在尝试使用在C# 在try..catch with Elmah中处理的日志异常,c#,exception,exception-handling,try-catch,elmah,C#,Exception,Exception Handling,Try Catch,Elmah,我正在尝试使用在try…catch块中处理的Elmah异常进行日志记录 我在global.axax上添加了一个全局句柄错误过滤器: public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new ElmahHandledErrorLoggerFilter()); filters.Add(new HandleErrorAttribute()); } 这是我的Elm
try…catch
块中处理的Elmah异常进行日志记录
我在global.axax
上添加了一个全局句柄错误过滤器:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new ElmahHandledErrorLoggerFilter());
filters.Add(new HandleErrorAttribute());
}
这是我的ElmaHandleErrorLoggerFilter
:
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,而不会记录异常。例如:
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。如果主方法catch还有一个抛出新异常()
代码,则它会记录该异常。但是,它将被记录,堆栈跟踪指向main方法
,而不是SecondMethod
我想要的是,每当它到达一个catch而不重新抛出一个新的异常时,Elmah就会记录该异常。这是因为我的应用程序中有许多try-catch块,我希望记录这些异常,而不必手动记录每个try-catch。但是,如果您告诉我如何从
SecondMethod
记录异常,那就好了。您使用的是ASP MVC吗
过滤器将仅对从控制器方法引发的未处理异常执行。(context.ExceptionHandled属性告诉您它是否已由另一个筛选器处理,而不是在try-catch块中)。因此,如果您在方法内的try-catch块中吞下异常,那么它们将不会被错误过滤器处理
您需要决定何时使用try-catch块手动处理代码内部的异常(在这种情况下,在基本控制器类或帮助器类的帮助下手动记录异常),或者让异常冒泡并由过滤器处理。(根据每个特定的用例,您可能需要两者的混合)
当您决定重新显示异常时,请查看。基本上,您可以通过以下方法重新显示保留堆栈跟踪的异常:
try
{
//code
}
catch (Exception ex)
{
//...some error handling code here...
//Otherwise why the try-catch at all?
throw;
}
您可以在示例main方法中这样做,记录的异常将保留堆栈跟踪