执行catch语句中的所有内容,而不会抛出更多错误

时间:2015-02-06 08:55:37

标签: c#

我有一段代码,我尝试一次签署许多代表,但如果其中任何一个是null,我必须取消所有其他代理。

try
{
    this.var1.asdf += ...

    this.var2.asdf += ...

    this.var3.asdf += ...

    this.var4.asdf += ...

    //and so on
}
catch
{
    try {
    this.var1.asdf -= ...
    }catch{}

    try{
    this.var2.asdf -= ...
    }catch{}

    try{
    this.var3.asdf -= ...
    }catch{}

    //and so on
}

如何避免所有那些尝试捕捉大捕获?我也不想使用"如果不是空语句"。我想继续在catch块内的所有委托,无论它们是否可能抛出空引用异常。所有行都需要在catch块内执行。

有没有办法告诉catch不要抛出任何进一步的错误并运行它的所有代码?

2 个答案:

答案 0 :(得分:10)

不,没有,如果我需要做某事并忽略结果,我通常会写一个try函数。忽略异常并非最佳做法,但我理解有时这样做是可以接受的:

public T Try(Action<T> action)
{
   try 
   {
      return action();
   }
   catch(Exception ex)
   { 
       // Log the exception so you're at least aware of it
   }
}

然后您可以按以下方式调用它:

Try(() => { var1.asdf.DoSomething(); });

阅读了您的一条评论后,这可能是另一种不使用例外的方法:

public static void IfNotNull(this T value, Action<T> action)
{
   if(value != null)
      action(value);
}

然后你可以调用,这使得在代码中进行空检查并防止任何异常(顺便说一下,这很慢)这样很好很干净。

var1.IfNotNull(v => v.asdf.DoSomething());

答案 1 :(得分:1)

基于@lan响应,没有匿名方法:

try
{
    this.var1.asdf += var1OnAsdf;

    this.var2.asdf += var2OnAsdf;

    this.var3.asdf += var3OnAsdf;

    this.var4.asdf += var4OnAsdf;

    //and so on
}
catch
{
    TryUnregister(this.var1, var1OnAsdf);
    TryUnregister(this.var2, var2OnAsdf);
    TryUnregister(this.var3, var3OnAsdf);

    //and so on
}

void TryUnregister(VarType var, DelegateType d)
{
    if (var == null) return;
    var.asdf -= d;
}