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

我有一个类如下:

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块,即使只有一行代码。

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


为什么重新发明方向盘,何时有免费 Post 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中的overriden函数OnException()中放置的代码。

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


你太防守了。 不要过度使用try..catch只会在需要的地方抓住它。

在这种情况下,考虑捕获在课堂之外与您的课程交互引发的异常。 记住例外将被传播。


使用策略注入应用程序块,Castle,Spring.NET等库。这些库允许您将行为注入异常捕获。

链接地址: http://www.djcxy.com/p/25865.html

上一篇: How to catch all exceptions at class level in CSharp?

下一篇: Proper way to declare custom exceptions in modern Python?