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方法中这样做,记录的异常将保留堆栈跟踪