【问题标题】:IS NOT operator in C#C# 中的 IS NOT 运算符
【发布时间】:2011-01-23 17:43:51
【问题描述】:

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

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

【问题讨论】:

  • 你可以这样做:If Not object.ReferenceEquals(err.GetType(), GetType(ThreadAbortException)) Then

标签: c# operators


【解决方案1】:

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

if (!(err is ThreadAbortException))

【讨论】:

  • +1:这是正常的方式,但是 catch 块有更好的方式。
【解决方案2】:

只需将 catch 块更改为:

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

这样您就可以分别处理 ThreadAbortExceptions 和所有其他异常。

【讨论】:

  • 这是针对当前情况的更好解决方案。 +1
  • 唷,这很接近。我讨厌在任何地方看到!(a is B)
  • 看问题中的代码sn-p其实让我很困惑,好像我忘记了如何捕获异常。这确实是正确的方法。
  • 确保将更通用的异常对象放在底部。您应该始终从更精确的类型开始,然后使用更通用的类型。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    也许你正在寻找这个:

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

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

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

    【讨论】:

      【解决方案5】:

      你应该可以做这样的事情:

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

      【讨论】:

      • 您可能想要catch 分离异常类型的一个原因是您可以对每种异常类型使用不同的finally 块。也许有些异常是不可恢复的(如果这些异常发生,你在 finally 块中清理你的资源),而另一些是可恢复的(你保持资源不变,并允许调用者对其进行排序)。
      【解决方案6】:

      请注意:从 C# 9 开始,您应该能够使用“不是”。 https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9#pattern-matching-enhancements

      这不会改变最佳答案。在你的情况下,我仍然支持:

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

      我最近遇到了一个案例,我需要确保内部异常不是,但我最终不得不使用:

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

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

      【讨论】:

        【解决方案7】:

        李有最好的答案。

        补充一点,您应该始终从最具体的内容到最一般的内容。在您的情况下,ThreadAbortException 是最具体的,因此请先处理。

        【讨论】:

          猜你喜欢
          • 2014-02-21
          • 1970-01-01
          • 2011-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多