2009-10-24 8 views
0

Dans mon serveur multithread J'utilise le code suivant (avant d'exécuter le formulaire lui-même ou bien sûr)WinForms - pourquoi mes exceptions ne sont-elles pas prises?

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomainUnhandledException); 
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ApplicationThreadException); 

Les méthodes appelées écrivent des exceptions à la liste afin que je puisse le fixer facilement. Mais aujourd'hui je suis venu et j'ai vu que VS avait jeté NullReference exception et je n'ai aucune idée pourquoi il n'a pas été attrapé?

je peux le reproduire en appelant:

stream = null; 
stream.Flush(); 

Le programme ne saute à la capture exception portée mais il reste sur la chasse line..strange. Toute autre exception est bien gérée ... peut-être parce que cette méthode n'est pas encore implémentée? Je suis sûr d'avoir vu "Object reference not set to an instance of object" dans ma liste d'exceptions et le programme s'est poursuivi. Pourquoi cette exception particulière n'est-elle pas attrapée?

Répondre

0

Pour répondre à votre question, nous avons besoin de plus d'informations sur l'erreur qui a été lancée. Cela provient-il de votre code? Voyons la trace de la pile. De plus, si vous appelez Application.Run (...) avant de configurer l'exception ThreadException, aucune exception ne sera interceptée.

+0

? Je pense que vous l'avez écrit vice versa, vous devez définir threadexception avant d'exécuter l'application ... Quoi qu'il en soit, cela fonctionne bien, toujours attraper l'expcetion, mais le seul après semaines n'a pas été intercepté - j'ai appelé la fonction future stream.FLush () et le flux était nul. – Thomas

+0

Mon erreur, c'est ce que je voulais dire. –

+0

Huf, j'avais peur que je ne comprenne pas bien. Je l'ai essayé à nouveau avec le réglage du flux à null et puis appel Flush - avec le débogueur, l'exception est interceptée mais il reste coincé sur la ligne Flush et répète encore ... peut-être parce que ce n'est pas mis en œuvre? – Thomas

0

Nous utilisons le code suivant et trouve cela fonctionne bien: -

namespace YourNamespace 
{ 
    static class Program 
    { 

     [STAThread] 
     static void Main() 
     { 
      AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
      Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 
      Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 

     static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 
     { 
      HandleException(e.Exception); 
     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      HandleException((Exception)e.ExceptionObject); 
     } 

     static void HandleException(Exception e) 
     { 
      //Handle exception 
     } 

    } 
} 

Merci,

Phil http://exceptioneer.com

Questions connexes