【问题标题】:null check in try catch [closed]空检查尝试捕获[关闭]
【发布时间】:2011-06-25 19:28:09
【问题描述】:

我的 WCF 服务方法中有一个 try catch 块,其中包含对对象的 if 检查。对象“objRequest”作为服务操作输入参数出现。这是代码:

try
{
    if (objRequest == null)
    {
        //the lines here dont execute even though objRequest is null
        ...
        ...
    }

    //remaining code here
}
catch
{
    ...
}

现在是奇怪的部分。如果我将 if 检查放在 try 块之外,则 if 检查有效。

if (objRequest == null)
{
 //This 'if' check returns true when outside the try block and the line now executes.
  .....
  ....

}
try
{


    //remaining code here
}
catch
{
    ...
}

在此处截取一张图片以证明我在说什么。如果对象为空,为什么要进入 else 块?

我觉得这很神奇,但不是很好。我在这里错过了什么?

【问题讨论】:

  • 除此之外,在这种情况下,您可能应该抛出 NullReferenceException 而不是一般的 Exception
  • @Dan:你通常不应该抛出NullReferenceException,而应该抛出ArgumentNullException(如果objRequest是一个参数)或者InvalidOperationException
  • @user20358:objRequest 不是可为空的类型“int?或 bool?”对吗?
  • if 语句在 try 块内部或外部的计算结果相同。换句话说,你的问题是不正确的。
  • 你能发布不适合你的完整代码吗?

标签: c# .net if-statement try-catch


【解决方案1】:

您的屏幕截图清楚地显示该对象不为空,因为您可以看到其属性的值。这些属性都是空的,这让你感到困惑。

【讨论】:

    【解决方案2】:

    这就是异常抛出/处理的工作原理。

    try
    {
        throw new Exception();
        //remaining code
    }
    catch (SomeException)
    {
        // the exception above will not be caught here
    }
    catch (Exception)
    {
        // however it will be caught here
    }
    // code here will know nothing about the exception 
    

    【讨论】:

    • 你没有得到我的问题。当在 try 块中时,'if (objREquest==null)' 语句等同于 false。当我将相同的语句放在 try 块之外,在它上面,在 try 块开始之前,它就等于 true。在这两种情况下它都是空的。
    • 所以我的问题是,在 try 块内部和外部,'if' 条件的行为有何不同。
    • @user20358:还有更多事情发生,100%。否则你所描述的不可能是真的,对不起。
    • @user 你错了,try 并没有改变 if 的意思
    【解决方案3】:

    这也应该有效:

    try
    {
        if (objRequest == null || default(HereGoesTheobjRequestClassName))
        {
            throw new ArgumentException("Here goes your custom exception message");
        }
    }
    catch (Exception)
    {
        // Your catch block here
    }
    

    【讨论】:

      【解决方案4】:

      问题中的示例代码没有显示捕获了哪个特定的异常类,也没有显示在 catch 块中发生了什么。也许您希望该方法抛出异常,但是当您从 try 块中抛出它时,它会在 catch 块中被捕获。但是,如果您从 try 块的外部抛出异常,它不会被捕获,而是会从方法中抛出给调用者。

      【讨论】:

      • 重新编辑了我的问题。问题不在于抛出异常。这只是我对 IF 语句的问题。该对象的所有值均为空。那么我的对象不应该等于 null 吗?
      • “对象的所有值都为空”是什么意思?一个对象的所有字段都可以设置为空。这不会使对象引用为空。
      【解决方案5】:

      它似乎工作正常。

      object objRequest = null;
      try
      {
          if (objRequest == null)
          {
              throw new Exception("details not recieved");
          }
          //remaining code here
      }
      catch (Exception e)
      {
        Console.WriteLine("Exception");
      }
      

      编辑:

      在屏幕截图中,您提供的对象不为空,只是其中的属性

      【讨论】:

      • @Jalal 他遗漏了一些代码,例如他正在捕获哪种类型的异常。我是否“怀疑”代码会起作用,是的,我做到了......
      • objRequest 是我的 wcf 服务方法中的一个参数。当我通过 WCFTestclient 测试我的方法时,我不会在测试客户端中添加任何值并按原样调用它。我也没有这一行“object objRequest = null;”在我的代码中。
      • 是的,如果我没有设置任何参数,我认为 wcftestclient 会发送一个 null 对象,并且我确信它在 try 块之外时等于 null,但不是其他情况。再也不要在凌晨 2 点发布问题!
      猜你喜欢
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      相关资源
      最近更新 更多