2009-09-14 42 views
1

抱歉,关于奇怪的问题标题,但我真的不知道该怎么称呼它。这对我来说根本没有意义。下面是代码:C#:为什么忽略此代码?

public partial class ParameterPanel : FlowLayoutPanel 
{ 
    ... 

    public void SetContents(IEnumerable<IParameter> parameters) 
    { 
     if (parameters == null || !parameters.Any()) 
      return; 

     SuspendLayout(); 
     Controls.Clear(); 

     foreach (IParameter parameter in parameters) 
     { 
      Control control = Factory.Create(parameter); 
      Controls.Add(control); 
     } 

     Console.WriteLine("???"); 

     ResumeLayout(false); 
     PerformLayout(); 
    } 
} 

奇怪的是,有时代码不会继续执行Console.WriteLine我的方法开始打破,并尝试步吧。它进入foreach循环,但在最后一项之后,该方法返回?它永远不会到达Console.WriteLine。我只是不明白...这怎么可能?最奇怪的是,它总是不会发生。但它一贯发生在它所做的事情上。

任何人有什么线索是怎么回事?我甚至不知道从哪里开始寻找这个bug。

+0

Controls.Add()在这一点上失败了吗? –

+0

我认为一个例外会把你踢出这个方法...... –

+0

啊,grr,找到了它。它是由工厂创建的控件之一的构造函数中发生的NullReferenceException。抛弃我的东西是,这个异常没有使任何事情崩溃。它只是......发生并被忽略,显然。注意到它在输出控制台。必须在Debug - > Exceptions ...菜单中打开该异常的Break事件。哦,好吧...... *叹息* – Svish

回答

4

如果事情在方法抛出异常的方法的其余部分将被跳过。

命中调试 - >例外和蜱为CLR例外框,使VS尽快抛出一个异常中断。

+0

是的,发现它使用了。但为什么它没有突破呢?我得到的只是“在TheApp.dll中发生类型'System.NullReferenceException'的第一次机会异常”,我不明白它在哪里被吃掉。 – Svish

+0

捕捉异常的东西更高。我注意到你从FlowLayoutPanel继承;被设置的内容是从一些在FlowLayoutPanel中具有处理异常的调用者的重写方法中捕获的?尝试处理AppDomain.CurrentDomain.UnhandledException事件以查看它是否发生在后台线程上 - 尽管由于这看起来像GUI代码,我假设它不在后台线程上。 –

0

添加检查,如果控制已成功创建,如果不是则跳过添加。

foreach (IParameter parameter in parameters) 
{ 
    Control control = Factory.Create(parameter); 
    if (control!=null) { 
     Controls.Add(control); 
    } 
} 
1

一个怪胎:如果parameters为空或空的,你永远也恢复或进行布局......我知道这不是你正在运行到的情况,但它的东西来解决。

另一种可能是个例外被在环某处抛出。

+0

哦,那是真的。谢谢你让我知道! – Svish

+0

固定为代码,所以现在不应该如此。我希望... – Svish

0

可能是一个例外出现在foreach,尝试检查调试 - >者除外>公共语言运行时异常,看看是否有任何异常或不

0

由于乔恩斯基特说,该行 -

if (parameters == null || !parameters.Any()) return; 

被返回功能,因此在这种情况下,你永远不会得到任何更远。在方法开始时强制执行这种合同是很常见的,但在这种情况下通常会引发异常。

+0

是的,但在我的情况下,这不是问题。该方法确实已经过去了。无论如何,这个问题是由控件构造函数中抛出的异常造成的。 – Svish