2010-10-23 17 views
0

J'ai un fil qui me j'initialiser comme ceci:Unhandled FileLoadException que je pense que je suis la manipulation

Utility.Log("1"); 

myThread = new Thread(new ThreadStart(delegate 
{ 
    Utility.Log("2"); 

puis le reste de l'exécution du thread. Ce qui est bizarre, c'est que malgré le fait que tout soit enveloppé dans un try/catch, je vois seulement un 1 dans mon fichier journal (no 2), et je reçois une exception System.IO.FileLoadException non gérée. J'ai essayé aussi d'encapsuler le corps entier du délégué dans un try/catch, mais je reçois toujours cette exception, et l'Event Viewer dit que la méthode la plus haute de l'exception est cette méthode. C'est très bizarre.

Avez-vous des idées sur la façon dont je peux traquer cela, ou au moins attraper correctement l'exception?

+0

Quel message le FileLoadException a-t-il reçu? Et que montre la trace de la pile? – jgauffin

Répondre

1

Un FileLoadException est une mésaventure assez sérieux. Il est levé lorsque le compilateur JIT essaie de compiler le code que vous exécutez dans votre thread. Une paire try/catch ne peut pas intercepter cette exception car elle est déclenchée avant que le code ne commence à s'exécuter. En d'autres termes, il bombarde avant vous entrez dans le bloc try. Étant donné qu'il s'agit d'un thread, vous ne pouvez pas empêcher votre programme de se bloquer sur le bureau. Le dernier souffle que vous avez est AppDomain.UnhandledException, la propriété InnerException d'e.ExceptionObject vous indique ce qui ne va vraiment pas.

Cette exception devrait normalement être facilement réparable. C'est un problème de configuration, le compilateur JIT trouve un assembly qui a le mauvais numéro de version ou est une ancienne version de l'assembly, quelque chose comme ça. Si vous ne pouvez pas le diagnostiquer à partir de AppDomain.UnhandledException, l'outil Fuslogvw.exe peut vous montrer comment trouver le mauvais assemblage. Une reconstruction complète de votre solution devrait être à mi-chemin à une solution.

1

Vous avez seulement affiché une partie de votre code, il est donc impossible de répondre à votre question. Alors, voici un conseil général.

N'utilisez jamais de méthodes anonymes pour les threads. Il est très facile de faire quelque chose de mal et les exceptions non interceptées dans les threads peuvent faire tomber toute votre application.

public void MyMethod() 
{ 
    _myThread = new Thread(WorkerThread); 
    _myThread.Start(); 
} 

public void WorkerThread(object state) 
{ 
    try 
    { 
     Utility.Log("2"); 
    } 
    catch (Exception e) 
    { 
     //log error 
    } 
} 
1

Le try..catch n'attrapera certainement des exceptions d'origine dans votre nouveau fil, que dans le fil d'origine.

Si vous voulez savoir ce qui se passe dans le thread fils, vous devrez lui donner sa propre gestion des exceptions. Il semble que vous ayez essayé de le faire par "j'ai essayé d'emballer également le corps entier du délégué dans un try/catch", mais ce code modifié serait nécessaire pour confirmer son exactitude.

Vous devriez également être capable de réduire cette valeur en effectuant un débogage dans le thread enfant.

1

Vous devez ajouter un gestionnaire d'événements d'exception fil:

il suffit d'ajouter le gestionnaire avant application.run et vous pouvez attraper toutes les exceptions de fil non gérées.

Source de msdn:

[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)] 
public static void Main(string[] args) 
{ 
    // Add the event handler for handling UI thread exceptions to the event. 
    Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException); 

    // Set the unhandled exception mode to force all Windows Forms errors to go through 
    // our handler. 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

    // Add the event handler for handling non-UI thread exceptions to the event. 
    AppDomain.CurrentDomain.UnhandledException += 
     new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

    // Runs the application. 
    Application.Run(new ErrorHandlerForm()); 
} 

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx