Необработанная Fileloadexception, что я думаю, я обработаю

StackOverflow https://stackoverflow.com/questions/4005876

Вопрос

У меня есть нить, которую я инициализирую, как это:

Utility.Log("1");

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

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

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

Это было полезно?

Решение

FileLoadexception - довольно серьезное неудачное. Он поднят, когда Compiler JIT пытается компилировать код, который вы запускаете в своей теме. Пара попробовать / ловить не может поймать это исключение, потому что он поднимается до Код запускает выполнение. Другими словами, это бомбы до Вы входите в блок Try. Учитывая, что это нить, вы не можете остановить вашу программу разбиться на рабочий стол. Последний вздох у вас есть appdomain.unhandledexception, свойство interrexception e.exceptionObjects говорит вам, что действительно не так.

Это исключение в противном случае должно всегда быть легко исправлена. Это проблема конфигурации, Compiler JIT находит сборку, которая имеет неправильный номер версии или является старой версией сборки, что-то подобное. Если вы не можете диагностировать его из appdomain.unhandledexception, то инструмент fuslogvw.exe может показать вам, как он находит неправильную сборку. Полная восстановление вашего решения должно быть на полпути к исправлению.

Другие советы

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

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

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

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

Оригинал try..catch Не определенно не поймают исключения в вашей новой теме, только в исходном потоке.

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

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

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

Просто добавьте обработчик перед 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top