我有一个线程可以像我这样初始化:
Utility.Log("1");
myThread = new Thread(new ThreadStart(delegate
{
Utility.Log("2");
然后执行其余的线程。奇怪的是,尽管整个事情被包装在try / catch中,我只在我的日志文件中看到1(没有2),并且我得到一个未处理的System.IO.FileLoadException。我已经尝试在try / catch中包装委托的整个主体,但我仍然得到该异常,并且事件查看器说该异常的最顶层方法是该方法。这很奇怪。
有关如何跟踪此问题或至少正确捕获异常的任何想法?
答案 0 :(得分:2)
FileLoadException是一个非常严重的事故。当JIT编译器尝试编译您在线程中运行的代码时引发它。 try / catch对无法捕获此异常,因为它在代码开始执行之前被引发。换句话说,它在进入try块之前轰炸。鉴于这是一个线程,您无法阻止程序崩溃到桌面。你有的最后一个喘息是AppDomain.UnhandledException,e.ExceptionObject的InnerException属性告诉你出了什么问题。
否则,此异常应始终容易修复。这是一个配置问题,JIT编译器找到一个具有错误版本号的程序集,或者是程序集的旧版本,就像这样。如果您无法从AppDomain.UnhandledException诊断它,那么Fuslogvw.exe工具可以向您显示它是如何找到错误的程序集。完全重建您的解决方案应该是修复的一半。
答案 1 :(得分:1)
您只发布了部分代码,因此无法回答您的问题。所以这是一般性建议。
永远不要对线程使用匿名方法。执行错误很容易,线程中未被捕获的异常会导致整个应用程序崩溃。
public void MyMethod()
{
_myThread = new Thread(WorkerThread);
_myThread.Start();
}
public void WorkerThread(object state)
{
try
{
Utility.Log("2");
}
catch (Exception e)
{
//log error
}
}
答案 2 :(得分:1)
原始try..catch
肯定不会在新线程中捕获异常,只能在原始线程中捕获异常。
如果你想弄清楚子线程中发生了什么,你必须给它自己的异常处理。听起来你试图这样做“我已经尝试将代理的整个主体包裹在try/catch
”中,但是需要更改代码来确认其正确性。
您还应该能够通过调试子线程来缩小范围。
答案 3 :(得分:1)
您需要添加线程异常事件处理程序:
只需在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