如何在CSharp中捕获类级别的所有异常?

时间:2014-03-13 11:19:09

标签: c# exception exception-handling

我有一个类:

class SampleRepositoryClass
{
    void MethodA()
    {
        try
        {
            //do something
        }
        catch(Exception ex)
        {
            LogError(ex);
            throw ex;
        }        
    }

    void MethodB(int a, int b)
    {
        try
        {
            //do something
        }
        catch(Exception ex)
        {
            LogError(ex);
            throw ex;
        }
    }

    List<int> MethodC(int userId)
    {
        try
        {
            //do something
        }
        catch(Exception ex)
        {
            LogError(ex);
            throw ex;
        }
    }
}

在上面的示例中,您可以看到在每个方法(MethodA,MethodB,MethodC)中都有try ... catch块来记录错误,然后抛出更高级别。

想象一下,当我的Repository类可能有超过100个方法时,在每个方法中我都尝试了... catch块,即使只有一行代码。

现在,我的目的是减少这些重复的异常日志记录代码,并在类级而不是方法级别记录所有异常。

4 个答案:

答案 0 :(得分:6)

为什么要重新发明轮子,当有免费发布Sharp Express时。 这就像添加PostSharp.dll作为项目的参考一样简单。 完成后,您的存储库将如下所示:

[Serializable]
class ExceptionWrapper : OnExceptionAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        LogError(args.Exception);
        //throw args.Exception;
    }
}

[ExceptionWrapper]
class SampleRepositoryClass
{
    public void MethodA()
    {
        //Do Something
    }

    void MethodB(int a, int b)
    {
        //Do Something
    }

    List<int> MethodC(int userId)
    {
        //Do Something
    }
}

在类上添加ExceptionWrapper属性,确保所有属性和方法都封装在try / catch块中。 catch中的代码将是您在ExceptionWrapper中的覆盖函数OnException()中放入的代码。

你也不需要编写代码来重新抛出。如果提供了正确的流行为,也可以自动重新抛出异常。请查看相关文档。

答案 1 :(得分:1)

你过于防守。不要过度使用try..catch只能抓住你需要的地方

在这种情况下,请考虑通过与班级之外的班级互动来捕捉异常。记住异常会被传播。

答案 2 :(得分:1)

使用诸如Policy Injection Application Block,Castle,Spring.NET等库。这些库允许您将行为注入异常捕获。

答案 3 :(得分:1)

App.xaml.cs 中实施 DispatcherUnhandledException ;它会处理你所有的例外情况;

    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            DispatcherUnhandledException += App_DispatcherUnhandledException;
        }
        void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            LogError(e);
// MessageBox.Show(e.Exception.Message);
            e.Handled = true;
        }