1

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

Utility.Log("1");

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

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

关于如何追踪这一点,或者至少正确捕获异常的任何想法?

4

4 回答 4

2

FileLoadException 是一个非常严重的事故。当 JIT 编译器尝试编译您在线程中运行的代码时会引发它。try/catch 对无法捕获此异常,因为它是在代码开始执行之前引发的。换句话说,它会在你进入 try 块之前就爆炸了。鉴于这是一个线程,您无法阻止程序崩溃到桌面。您最后的喘息是 AppDomain.UnhandledException,e.ExceptionObject 的 InnerException 属性告诉您真正出了什么问题。

否则,此异常应始终易于修复。这是一个配置问题,JIT 编译器发现一个版本号错误的程序集或者是旧版本的程序集,类似这样。如果您无法从 AppDomain.UnhandledException 诊断它,那么 Fuslogvw.exe 工具可以向您展示它如何找到错误的程序集。完全重建您的解决方案应该是修复的一半。

于 2010-10-23T22:53:41.343 回答
1

您只发布了部分代码,因此完全不可能回答您的问题。所以这里有一个一般性的建议。

永远不要对线程使用匿名方法。做错事很容易,线程中未捕获的异常会导致整个应用程序崩溃。

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

public void WorkerThread(object state)
{
    try
    {
      Utility.Log("2");
    }
    catch (Exception e)
    {
       //log error
    }
}
于 2010-10-23T20:22:08.050 回答
1

原始try..catch线程肯定不会在您的新线程中捕获异常,只会在原始线程中捕获异常。

如果你想弄清楚子线程中发生了什么,你必须给它自己的异常处理。听起来您尝试按照“我也尝试将委托的整个主体包装在一个try/catch”中来执行此操作,但是需要更改的代码来确认其正确性。

您还应该能够通过调试到子线程来缩小范围。

于 2010-10-23T20:46:10.017 回答
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

于 2010-10-23T21:33:15.040 回答