忽略C#中的异常

San*_*ood 22 c# exception

有没有更好的方法来忽略C#中的异常,而不是将它放在try catch块中并且在catch中什么都不做?我发现这种语法很麻烦.对于代码块,我不能简单地以这种方式"标记"它,以便运行时知道忽略哪些异常?

Dro*_*per 27

我不认为有一个技巧可以避免异常,但您可以使用以下代码片段:

public void IgnoreExceptions(Action act)
{
   try
   {
      act.Invoke();
   }
   catch { }
}
Run Code Online (Sandbox Code Playgroud)

使用该方法如下:

IgnoreExceptions(() => foo());
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是使用AOP(面向方面​​编程) - 有一个名为PostSharp的工具,它允许您创建一个属性,该属性将捕获特定程序集/类/方法中的所有异常,这更接近您正在寻找的内容.

  • *@Dror*,好主意.但请注意,您的代码包含一个微妙的错误:CLR实际上允许抛出*any*值,而不仅仅是类型为`Exception`的对象(此限制仅由C#强制执行).所以,你应该简单地重写你的`catch`块:**`catch {}`**; 否则,某些异常异常可能实际上会回到调用方! - 参见[此博客文章](http://blogs.msdn.com/b/shawnfa/archive/0001/01/01/400749.aspx)(约两页)以供参考. (8认同)
  • 代替act.Invoke(),为什么不使用act()? (2认同)

Sno*_*ear 6

你可以用AOP做到这一点.例如,Postsharp将允许您轻松实现此类属性,该属性将跳过应用此类属性的方法中的特定异常.没有AOP我没有看到任何好的方法(如果我们假设有一个很好的方法来做这些事情;)).

使用Postsharp,您将能够以这种方式装饰您的方法:

[IgnoreExceptions(typeof(NullReferenceException), typeof(StackOverflowException))]
void MyMethod() { ... }
Run Code Online (Sandbox Code Playgroud)