我有一个线程,让我初始化这样的:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top