Необработанная Fileloadexception, что я думаю, я обработаю
-
25-09-2019 - |
Вопрос
У меня есть нить, которую я инициализирую, как это:
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.