未处理FileLoadException,我觉得我处理
-
25-09-2019 - |
题
我有一个线程,让我初始化这样的:
Utility.Log("1");
myThread = new Thread(new ThreadStart(delegate
{
Utility.Log("2");
和则该线程的执行的其余部分。奇怪的是,尽管整个事情被包裹在一个try / catch,我只在我的日志文件(第2号)看到一个1,和我得到一个未处理System.IO.FileLoadException。我试过也包裹了代表的整个身体在一个try / catch,但我仍然收到这个异常,事件查看器是说,异常的最顶端的方法是方法。这是非常奇怪的。
这是我怎么能追踪下来,或者至少去适当地捕捉异常任何想法?
解决方案
一个FileLoadException是一个相当严重的事故。当JIT编译器试图编译您在线程中运行的代码,复活。因为它被升高的前的代码开始执行一个try / catch对不能捕获此异常。换句话说,它炸弹的前的你进入try块。考虑到这是一个线程,你不能从崩溃到桌面停止你的程序。你拥有的最后关头是AppDomain.UnhandledException,该e.ExceptionObject的InnerException属性会告诉你什么是真正走错了。
此异常应否则总是很容易解决的。这是一个配置问题,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 /库/ system.windows.forms.application.threadexception.aspx