2010-03-04 115 views
14

我在C#中找不到“不是”运算符。 例如,我有下面的代码不起作用。我需要检查err是不是类型ThreadAbortExceptionC不是运算符#

catch (Exception err) 
    { 
     if (err is not ThreadAbortException) 
     { 
     } 
    } 
+0

谢谢了两个答案都工作;) – Tomas

+0

你可以这样做:如果没有object.ReferenceEquals(err.GetType()的GetType(ThreadAbortException))然后 –

回答

35

catch块只是更改为:

catch(ThreadAbortException ex) 
{ 
} 
catch(Exception ex) 
{ 
} 

所以你可以单独处理ThreadAbortExceptions和所有其他人。

+1

这是更好的解决当前情况的方法。 +1 –

+2

噢,那很接近。我讨厌在任何地方看到'!(a是B)'! – ChaosPandion

+0

看着问题中的代码片段实际上让我感到困惑,那是因为我忘记了如何捕获异常。这确实是正确的方法。 – Finglas

33

在这种情况下,包装并检查布尔相反:

if (!(err is ThreadAbortException)) 
+0

+1:这是正常的方式,但抓块有更好的方法。 – Richard

2

你应该能够做这样的事情:

catch (Exception err){ 
    if (!(err is ThreadAbortException)) { 
    //Code 
    } 
} 
+0

您可能想要“捕捉”单独的异常类型的一个原因是,您可以在每种类型的异常上使用不同的'finally'块。也许有些异常是不可恢复的(如果发生这些异常,你可以在finally块中清理你的资源),而其他异常是可恢复的(你可以保持资源不变,并允许调用者将其排除)。 –

7

更可能是你应该在这种情况下做的是:

try 
{ 
    // Do Something 
} 
catch (ThreadAbortException threadEx) 
{ 
    // Do something specific 
} 
catch (Exception ex) 
{ 
    // Do something more generic 
} 

你可以有多个catch块的try 。务必确保按照最具体的最上面的顺序排列它们,而最通用的(catch (Exception ex))是最后一个,因为查找顺序是从上到下的,所以如果您先将catch (Exception ex)放在首位,它将永远是唯一跑。

1

Lee有最佳答案。

只要添加,你应该总是从最具体到最普遍。在你的情况下,ThreadAbortException是最具体的,所以首先处理。

2

也许你正在寻找这样的:

if(err.GetType() != typeof(ThreadAbortException)) 
{ 

} 

但我使用单独的catch语句强烈建议,由李的建议。

catch(ThreadAbortException ex) 
{ 

} 
catch(Exception ex) 
{ 

}