Необработанное исключение FileLoadException, которое, я думаю, обрабатывается - PullRequest
0 голосов
/ 24 октября 2010

У меня есть поток, который я инициализирую следующим образом:

Utility.Log("1");

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

, а затем остальная часть выполнения потока.Странно то, что, несмотря на то, что все это завернуто в try / catch, я вижу только 1 в моем лог-файле (нет 2), и я получаю необработанное System.IO.FileLoadException.Я также попытался обернуть все тело делегата в try / catch, но я все еще получаю это исключение, и средство просмотра событий говорит, что самый верхний метод исключения - это тот метод.Это очень странно.

Есть идеи, как я могу отследить это или, по крайней мере, правильно поймать исключение?

Ответы [ 4 ]

2 голосов
/ 24 октября 2010

FileLoadException - довольно серьезная ошибка.Он возникает, когда JIT-компилятор пытается скомпилировать код, который вы запускаете в своем потоке.Пара try / catch не может перехватить это исключение, потому что оно вызывается до , когда код начинает выполняться.Другими словами, это бомбы перед тем, как вы войдете в блок попытки.Учитывая, что это поток, вы не можете остановить сбой вашей программы на рабочем столе.Последний вздох у вас - AppDomain.UnhandledException, свойство InnerException объекта e.ExceptionObject сообщает вам, что на самом деле идет не так.

В противном случае это исключение всегда должно легко исправляться.Это проблема конфигурации, компилятор JIT находит сборку с неправильным номером версии или является старой версией сборки, что-то в этом роде.Если вы не можете диагностировать его с помощью AppDomain.UnhandledException, тогда инструмент Fuslogvw.exe может показать вам, как он находит неправильную сборку.Полное восстановление вашего решения должно быть на полпути к исправлению.

1 голос
/ 24 октября 2010

Исходный try..catch определенно не будет перехватывать исключения в вашей новой теме, только в исходной теме.

Если вы хотите выяснить, что происходит в дочернем потоке, вам придется предоставить ему собственную обработку исключений. Похоже, вы пытались сделать это в соответствии с «Я пытался также обернуть все тело делегата в try/catch», но этот измененный код потребуется для подтверждения его правильности.

Вы также должны быть в состоянии сузить это, отлаживая в дочернем потоке.

1 голос
/ 24 октября 2010

Вам необходимо добавить обработчик события исключения потока:

Просто добавьте обработчик перед application.run, и вы можете перехватить все необработанные исключения потоков.

Источник из 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

1 голос
/ 24 октября 2010

Вы опубликовали только часть своего кода, поэтому ответить на ваш вопрос совершенно невозможно. Итак, вот общий совет.

Никогда не используйте анонимные методы для потоков. Очень легко сделать что-то не так, а неперехваченные исключения в потоках могут повредить все ваше приложение.

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

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