消除重复的try/catch代码
本文关键字:catch 代码 try | 更新日期: 2023-09-27 18:02:09
编写必须一次又一次处理相同异常的代码会让人感到无聊。
是否有一种方法来编写代码,没有try/catch,并添加属性到方法来捕获(和处理)可能发生的各种异常?这听起来像AOP (Postsharp),这是理想的解决方案吗?
所以我想写类,可以规定在哪里/如何记录异常,重新抛出等,他们从属性和任何基类/接口派生。然后重用它们并将它们应用于整个代码中的不同方法。这将大大提高一致性。
谢谢
我建议编写以委托(如Func和Action)作为参数的方法。代表们将代表"尝试"阵营。各个方法将以不同的方式处理委托中发生的异常。
的例子:
OverflowHandler(delegate(){ checked{ x+=200; } });
overflowwhandler方法将处理OverflowException,并可能记录和重新抛出其他异常。
下面是OverflowHandler方法的示例:
public void OverflowHandler(Action func){
try {
func(); // call the delegate
} catch(Exception e){
if(e is OverflowException){
// handle the overflow exception
} else {
// log exception and rethrow
LogException(e);
throw;
}
}
}
这是来自MS实践和模式团队的一些东西。
异常处理应用程序块介绍http://msdn.microsoft.com/en-us/library/ff664698 (v = PandP.50) . aspx
显然他们有重新抛出+各种策略的概念。
要我推荐吗?不确定。我看了他们的实现,最后使用了他们的一些概念。我告诉自己我会回来的,但是我还没有机会。
听起来你确实在寻找AOP可以提供的功能。根据您的具体需求,您可以通过编写一些helper方法来获得许多相同的好处,而无需额外的开销,正如Peter O.建议的那样。
我个人没有发现我有很多重复的异常处理代码,因为异常是…嗯…例外。它们不应该是正常代码流的一部分,除非有一些非常具体的事情需要做,以响应特定类型的异常,否则最好的策略通常是根本不捕获它们,至少在它们逐渐上升到您想要记录它们的高级别之前。