2010-03-10 33 views
5

将以下内容复制并粘贴到VS中的新控制台应用程序中。添加对System.Web和System.Web.Services的引用(我知道控制台应用程序不需要这些程序集,我只是向您展示了一段在我的Web应用程序中不起作用的代码片段)。.net:调试器突出显示实际未执行的代码行

虽然if语句中的两个条件都是假的,但事实证明这是真的。任何人都知道原因? (Visual Studio 2008中9.0.30729.1).NET 3.5 SP1

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web.Services; 
using System.Web; 

namespace ConsoleApplication8 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string x = "qweqweqw"; 
      string y = 
       "{\"textMedia\":[-1,-1,-1,-1,-1],\"textOperand\":[1,1,1,1,1],\"textString\":[\"\",\"\",\"\",\"\",\"\"],\"dateSite\":[-11],\"dateOperand\":[],\"dateString\":[],\"status\":[-11,0,0],\"media\":[-11,0,0],\"subItem\":true,\"context\":false,\"branchSearch\":false,\"profileIDs\":[2,5,18],\"profileViewIDs\":[48,58,38],\"currentSelectedBranch\":0}"; 

      SaveSearch(x, y); 
     } 

     [WebMethod] 
     public static object SaveSearch(string name, string encodedSearch) 
     { 
      object response = new { }; 

      string x = name; 
      string y = encodedSearch; 

      // Why does this if statement throw an exception if both equal false? 
      if (x.Trim().Equals(string.Empty) || y.Trim().Equals(string.Empty)) 
       throw new AjaxErrorException("Save Search", "Something went wrong", "JSFunction"); 


      try 
      { 
       { 
        return new 
        { 
         error = false, 
         name = name, 
         userID = 123, 
         date = DateTime.Now 
        }; 
       } 
      } 
      catch (Exception ex) 
      { 
       String e; 

       if (HttpContext.Current.IsDebuggingEnabled) 
        e = ex.Message + "\n\n" + ex.StackTrace; 
       else 
        e = "error error aliens approaching"; 

       throw new AjaxErrorException("Save Search", e, ""); 
      } 

      return response; 
     } 

     public class AjaxErrorException : System.Exception 
     { 
      public AjaxErrorException(string title, string details, string function) 
       : base(title) 
      { } 
      string _stackTrace; 
      public override string StackTrace 
      { 
       get 
       { 
        return _stackTrace; 
       } 
      } 
     } 
    } 
} 
+0

逐步通过调试器,看看实际发生了什么。 – 2010-03-10 23:25:39

+0

你甚至尝试过我的代码吗? – 2010-03-10 23:26:15

+2

你甚至尝试过调试吗? – 2010-03-10 23:27:58

回答

8

我实际上检查并调试程序步入if(throw语句)后面的语句中,但实际上并没有抛出异常。我怀疑这是IDE,IL生成和调试器之间的矛盾,特别是对于throw语句。如果你尝试其他类型的陈述,你实际上没有看到问题。这似乎与此帖子相关 If statement weirdness in Visual Studio 2008

我在下面的if块中插入了assert语句,以确保没有触发任何断言。

System.Diagnostics.Debug.Assert(false); 
+0

感谢您的解释。最后:-) – 2010-03-10 23:40:55

+1

@Psycho - 欢迎光临。这实际上是一个有趣的发现,我也很好奇 – 2010-03-10 23:52:43

-1

你一个/两个字符串变量可能是空,不是空的。

编辑 你们为什么投票呢? 我猜测他的语句抛出NullReferenceException。

不管怎样,也许我的回答不够清楚:(

+1

如果是这样的话,Trim()会抛出。 – chrissr 2010-03-10 23:29:39

+0

如果它们为空,则会得到一个空引用异常。 – 2010-03-10 23:30:06

+0

@chrissr,@Otavio - 你是对的,但我猜测他有空引用异常。他说:“它变成了真的”,所以他认为这是真的,因为他期望抛出他的AjaxErrorException,但它不起作用。 – Novitzky 2010-03-10 23:42:31

0

空是不一样的空。所以null.Equals(string.Empty)返回false,但null.Trim()抛出一个空引用异常,所以你需要在测试空这个代码是第一个,正如@Otavio所建议的那样,string.IsNullOrEmpty()是正确的做法,不要忘记在检查完之后再修整字符串,因为你显然也担心只有空白字符串

I知道它现在对你没有帮助,但是.Net 4将有一个内置的方法,可以在同一个方法中进行修剪,空检查和空检查。


这应该做你需要的东西:

if (string.IsNullOrEmpty(x) || string.IsNullOrEmtpy(y) || x.Trim().Length == 0 || y.Trim().Length == 0) 
+0

我试过string.IsNullOrEmpty,这也不起作用。 – 2010-03-10 23:31:47

+1

@Sir Psycho - 你仍然必须修剪字符串_if_它通过空检查。 – 2010-03-10 23:33:01

+0

我修剪()的字符串和使用IsNullOrEmpty(),这仍然无法正常工作! – 2010-03-10 23:34:26

0

我只是尝试这样做:

string x = " text \t\t\n"; 
    string y = "not empty"; 

    if (x.Trim().Equals(string.Empty) || y.Trim().Equals(string.Empty)) 
     Console.WriteLine("TRUE"); 

和预期的一样也没有打印 'TRUE'。在'if'语句后面必须有其他错误,或者在你的实际代码中有分号?

编辑:抛出异常而不是写入,它不会抛出。你确定这是抛出的代码吗?

+1

我很困惑。为什么你会期望这打印真?我期望的是相反的。 – 2010-03-11 00:10:49

+0

措辞已经调整,阅读如下:“它没有打印'真';应该是预期的。”在这种情况下,分号前的所有内容都是预期的。该死的互联网。 – 2010-03-11 03:50:22

1

所以,我想这个粘贴确切的代码到VS2008新的控制台应用程序,添加必要的引用。这是它为我做的:

运行应用程序似乎没有抛出任何异常。 但是,当我在调试器中运行它并跨越第30行(带有if的行)时,调试器用黄色突出显示了网络线(带有throw)。我能够继续执行代码而不引发实际的异常。如果我在第31行(throw line)设置断点,它永远不会被击中。

我认为调试器的用户界面是简单的关闭。它似乎并未实际执行该代码。我不知道是什么原因造成的,但似乎没有什么可担心的。

0

这应该解决这个问题。首先,删除项目中obj和bin目录的内容。然后重启你的电脑。

如果这样不能解决问题,那么您可能需要重新安装Visual Studio。

+0

为什么这是downvoted?这是一个善意的回答,相当好的成功机会。 – 2010-03-10 23:47:50

+0

这不能解决任何问题,你可以将这段代码粘贴到一个新的控制台应用程序中(正如我已经说过的那样),你会得到同样的问题。 – 2010-03-11 05:15:57