我目前有这个班,我团队中的另一个程序员编码:
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并创建一个新的异常对象来包装它,然后抛出它只是为了沉默一层以上。
任何想法的人?
答案 0 :(得分:1)
听起来你真正想要的是根本不在Execute
内处理这个异常。处理异常的责任似乎在于调用Execute
的代码。
当然,你仍然可以抓住它,将其保存在ExecuterException
中,记录它,然后使用throw;
重新抛出它 - 但ExecuterException
的目的不在于我。看起来你只需要它IsSoapException
,反过来它更好地写成ExecuterException is SoapException
,甚至可以处理零点和子类。
如果没有看到使用您发布的代码的代码,我认为任何人都无法获得任何进一步的帮助。如果 代码仅在调用ExecuterException
后立即查询Execute
,那么您可以(并且应该)将其更改为该代码中的try / catch。如果它实际上在其他地方查询ExecuterException
,那么您可以考虑让 代码存储引用,但不管怎样,这意味着代码是非常纠结的意大利面条代码,可能需要一个主要的无论如何重写。
(顺便说一句,只是为了挑剔,代码中的两个catch子句中的第一个是完全冗余的。如果删除它,你会得到完全相同的行为 - 除非logger.log
具有SoapException
的特殊重载1}},但是你也应该对它进行重组。)