我有一段代码,我尝试一次签署许多代表,但如果其中任何一个是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不要抛出任何进一步的错误并运行它的所有代码?
答案 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;
}