我在C#中找不到“不是”运算符。 例如,我有下面的代码不起作用。我需要检查err
是不是类型ThreadAbortException
。C不是运算符#
catch (Exception err)
{
if (err is not ThreadAbortException)
{
}
}
我在C#中找不到“不是”运算符。 例如,我有下面的代码不起作用。我需要检查err
是不是类型ThreadAbortException
。C不是运算符#
catch (Exception err)
{
if (err is not ThreadAbortException)
{
}
}
catch块只是更改为:
catch(ThreadAbortException ex)
{
}
catch(Exception ex)
{
}
所以你可以单独处理ThreadAbortExceptions和所有其他人。
这是更好的解决当前情况的方法。 +1 –
噢,那很接近。我讨厌在任何地方看到'!(a是B)'! – ChaosPandion
看着问题中的代码片段实际上让我感到困惑,那是因为我忘记了如何捕获异常。这确实是正确的方法。 – Finglas
你应该能够做这样的事情:
catch (Exception err){
if (!(err is ThreadAbortException)) {
//Code
}
}
您可能想要“捕捉”单独的异常类型的一个原因是,您可以在每种类型的异常上使用不同的'finally'块。也许有些异常是不可恢复的(如果发生这些异常,你可以在finally块中清理你的资源),而其他异常是可恢复的(你可以保持资源不变,并允许调用者将其排除)。 –
更可能是你应该在这种情况下做的是:
try
{
// Do Something
}
catch (ThreadAbortException threadEx)
{
// Do something specific
}
catch (Exception ex)
{
// Do something more generic
}
你可以有多个catch
块的try
。务必确保按照最具体的最上面的顺序排列它们,而最通用的(catch (Exception ex)
)是最后一个,因为查找顺序是从上到下的,所以如果您先将catch (Exception ex)
放在首位,它将永远是唯一跑。
Lee有最佳答案。
只要添加,你应该总是从最具体到最普遍。在你的情况下,ThreadAbortException
是最具体的,所以首先处理。
也许你正在寻找这样的:
if(err.GetType() != typeof(ThreadAbortException))
{
}
但我使用单独的catch语句强烈建议,由李的建议。
catch(ThreadAbortException ex)
{
}
catch(Exception ex)
{
}
谢谢了两个答案都工作;) – Tomas
你可以这样做:如果没有object.ReferenceEquals(err.GetType()的GetType(ThreadAbortException))然后 –