C# 不是C中的运算符#
我在C#中找不到“is not”运算符。 例如,下面的代码不起作用。我需要检查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
err
是否不是classThreadAbortException
类型
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)),则