C# 不是C中的运算符#

C# 不是C中的运算符#,c#,operators,C#,Operators,我在C#中找不到“is not”运算符。 例如,下面的代码不起作用。我需要检查err是否不是classThreadAbortException类型 catch (Exception err) { if (err is not ThreadAbortException) { } } 在这种情况下,换行并检查布尔值: if (!(err is ThreadAbortException)) 只需将catch块更改为: catc

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

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

在这种情况下,换行并检查布尔值:

if (!(err is ThreadAbortException))

只需将catch块更改为:

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

因此,您可以分别处理ThreadAbortException和所有其他内容。

您应该能够执行以下操作:

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

在这种情况下,您更应该做的是:

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

对于
try
,可以有多个
catch
块。始终确保将它们排序为最具体的在顶部,最通用的(
catch(Exception ex)
)在最后,因为查找顺序是从上到下的,因此如果您将
catch(Exception ex)
放在第一位,它将始终是唯一要运行的


补充一句,你应该从最具体的到最一般的。在您的情况下,
ThreadAbortException
是最具体的,因此请先处理它。

也许您正在寻找以下内容:

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

}
但我强烈建议按照Lee的建议,使用单独的catch语句

catch(ThreadAbortException ex)
{

}
catch(Exception ex)
{

}
请注意:从C#9开始,您应该能够使用“is not”。

这不会改变最佳答案。就你而言,我仍然支持:

catch(ThreadAbortException ex)
{
}
catch(Exception ex)
{
}
我最近遇到了一个案例,我需要确保内部异常不是什么,所以我最终不得不使用:

try
{
   // Some code
}
catch (SomeException ex)
   when (ex.InnerException is not SomeOtherException)
{
   // Something I know how to handle
}

因此,同样,我不认为这会改变原始问题的答案,但为了将来的参考,这现在是可能的。

这是一个更好的解决当前情况的方法+哎呀,差一点。我讨厌看
!(a是B)
任何地方!查看问题中的代码片段实际上让我感到困惑,如果我忘记了如何捕获异常。这确实是正确的方法。请确保将更通用的异常对象放在底部。您应该总是从更精确的类型开始,然后再从更一般的类型开始。+1:这是正常的方法,但是catch块有更好的方法。您可能希望
catch
分离异常类型的一个原因是,您可以在每种异常类型上使用不同的
最后
块。可能有些异常是不可恢复的(如果发生这些异常,您将在finally块中清理资源),而其他异常是可恢复的(您将资源保持不变,并允许调用方对其进行排序)。您可以这样做:如果不是object.ReferenceEquals(err.GetType(),GetType(ThreadAbortException)),则