在异常对象中包装日志记录

时间:2010-08-01 08:00:01

标签: c# .net exception exception-handling

我目前有这个班,我团队中的另一个程序员编码:

public static class SoapExecuter
{
    private static readonly ILog logger;

    public static Exception ExecuterException { get; private set; }

    public static bool IsSoapException
    {
        get 
        {
            if (ExecuterException == null)
                return false;

            return ExecuterException.GetType() == typeof(SoapException);
        }
    }

    public static bool Execute(Action action)
    {
        ExecuterException = null;
        bool passed = false;

        try
        {
            action();
            passed = true;
        }
        catch (SoapException se)
        {
            ExecuterException = se;
            logger.log(se);
        }
        catch (Exception ex)
        {
            ExecuterException = ex;  
            logger.log(ex);
        }

        return passed;
    }
}

这不是很惯用,我想把它改成try ... catch子句中发生的事情 有没有办法不违反DRY并仍然保持语言提供的习语? 当然我可以从SoapException继承并记录它但是我必须捕获一个SoapException并创建一个新的异常对象来包装它,然后抛出它只是为了沉默一层以上。
任何想法的人?

1 个答案:

答案 0 :(得分:1)

听起来你真正想要的是根本不在Execute内处理这个异常。处理异常的责任似乎在于调用Execute的代码。

当然,你仍然可以抓住它,将其保存在ExecuterException中,记录它,然后使用throw;重新抛出它 - 但ExecuterException的目的不在于我。看起来你只需要它IsSoapException,反过来它更好地写成ExecuterException is SoapException,甚至可以处理零点和子类。

如果没有看到使用您发布的代码的代码,我认为任何人都无法获得任何进一步的帮助。如果 代码仅在调用ExecuterException后立即查询Execute,那么您可以(并且应该)将其更改为该代码中的try / catch。如果它实际上在其他地方查询ExecuterException,那么您可以考虑让 代码存储引用,但不管怎样,这意味着代码是非常纠结的意大利面条代码,可能需要一个主要的无论如何重写。

(顺便说一句,只是为了挑剔,代码中的两个catch子句中的第一个是完全冗余的。如果删除它,你会得到完全相同的行为 - 除非logger.log具有SoapException的特殊重载1}},但是你也应该对它进行重组。)