2009-09-14 10 views
1

Désolé pour le titre de question bizarre, mais je ne sais pas vraiment comment appeler ça. Cela n'a tout simplement aucun sens pour moi. Voici le code:C#: Pourquoi ce code est-il ignoré?

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(); 
    } 
} 

La chose étrange est que le code devient parfois jamais au Console.WriteLine je romps au début de la méthode et essayer de l'étape à travers elle. Il va dans la boucle foreach, mais après le dernier élément, la méthode retourne juste ?? Il n'atteint jamais le Console.WriteLine. Et je ne comprends pas ... Comment est-ce possible? Et la chose la plus étrange est que cela n'arrive pas toujours non plus. Mais cela arrive toujours dans les cas où c'est le cas.

Quelqu'un sait ce qui se passe ici? Je ne sais même pas par où commencer à chercher ce bug.

+0

Est-ce que Controls.Add() échoue peut-être à ce moment-là? –

+0

Je suppose qu'une exception vous exclut de la méthode ... –

+0

Ah, grr, je l'ai trouvé. Il s'agissait d'une exception NullReferenceException dans le constructeur de l'un des contrôles créés par l'usine. Ce qui m'a découragé, c'est que l'exception n'a rien cassé. C'est juste ... arrivé et a été ignoré, apparemment. Remarqué dans la console de sortie. Doit activer la chose Break pour cette exception dans le menu Déboguer -> Exceptions .... Eh bien ... * soupir * – Svish

Répondre

4

Si quelque chose dans la méthode émet une exception, le reste de la méthode sera ignoré. Hit Debug-> Exceptions et cochez la case pour les exceptions CLR pour que VS se brise dès qu'une exception est levée.

+0

Oui, je l'ai trouvé en utilisant ça.Mais pourquoi n'a-t-il pas éclaté en premier lieu? Tout ce que j'ai obtenu était "Une exception de première chance de type 'System.NullReferenceException' s'est produite dans TheApp.dll", et je ne comprends pas où il a été mangé. – Svish

+0

Est-ce quelque chose de plus haut attraper l'exception. J'ai remarqué que vous héritez du FlowLayoutPanel; Est-ce que le contenu défini est attrapé d'une méthode surchargée qui a un appelant dans FlowLayoutPanel qui gère l'exception? Essayez de gérer l'événement AppDomain.CurrentDomain.UnhandledException pour voir s'il se produit sur un thread d'arrière-plan - bien que cela ressemble au code de l'interface graphique, je suppose qu'il ne s'agit pas d'un thread d'arrière-plan. –

0

Ajouter une vérification si le contrôle a été créé avec succès, sinon sauter l'ajout.

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

Une bizarrerie: si parameters est nul ou vide, vous ne reprenez ou d'effectuer la mise en page ... Je sais que ce n'est pas la situation que vous êtes en cours d'exécution dans, mais il est quelque chose à corriger.

L'autre possibilité est qu'une exception est lancée quelque part dans la boucle.

+0

Oooh, c'est vrai. Merci de me le faire savoir! – Svish

+0

Fixé au code, ce ne devrait pas être le cas maintenant. J'espère ... – Svish

0

peut être une exception se produit dans le foreach, essayez de vérifier Debug-> exceptions près> Exceptions de Common Language Runtime, voir est-il une exception ou non

0

Comme le dit Jon Skeet, la ligne -

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

retourne la fonction, dans ce cas, vous ne serez jamais plus loin. Il est courant d'appliquer ce type de contrat au début d'une méthode, mais dans ce cas, une exception est généralement générée.

+0

Oui, mais dans mon cas ce n'était pas le problème. La méthode a fonctionné après cela. Quoi qu'il en soit, le problème a été provoqué par une exception qui a été lancée dans le constructeur d'un contrôle. – Svish

Questions connexes