未处理的FileLoadException,我认为我正在处理

时间:2010-10-23 20:16:21

标签: .net multithreading fileloadexception

我有一个线程可以像我这样初始化:

Utility.Log("1");

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

然后执行其余的线程。奇怪的是,尽管整个事情被包装在try / catch中,我只在我的日志文件中看到1(没有2),并且我得到一个未处理的System.IO.FileLoadException。我已经尝试在try / catch中包装委托的整个主体,但我仍然得到该异常,并且事件查看器说该异常的最顶层方法是该方法。这很奇怪。

有关如何跟踪此问题或至少正确捕获异常的任何想法?

4 个答案:

答案 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