C#捕获例外"主线程"

时间:2014-07-10 22:03:45

标签: c# mysql multithreading filenotfoundexception

我有一个应用程序,旨在在24/7服务器上运行。 Localy测试了一切正常工作和预期。部署到Windows Server 2012 R2 - 每当主要任务(线程)启动时,我都会遇到异常。

在服务器上我显然没有Visual-Studio,所以我无法调试ig。我刚刚得到一个丑陋的Windows对话框,声称“{ApplicationName}已停止工作。”。

在EventViewer中,我找到了一个条目,指出了错误的位置。

EventLog说:

Application: MyApplicationBackend.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException
Stack:
   at Application.Name.SomeClass..ctor()
   at Application.Name.SomeThread()
   at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ThreadHelper.ThreadStart()

好吧,在 SomeClass 的构造函数中,没有什么是关键的 - 只是一个mysql数据库连接,就像这样,(其中cfg。是一个单例,保存配置值):

 //Connecto to server.
 String connectionString = "server=" + cfg.DatabaseServer + ";user=" + cfg.DatabaseUser + ";database=" + cfg.DatabaseName + ";port=" + cfg.DatabasePort + ";password=" + cfg.DatabasePassword + ";";
 mysqlConnection = new MySqlConnection(connectionString);
  • 安装了MySQL Connector .Net 6.8.3
  • 代码将连接到远程数据库(本地网络)
  • 代码在我的本地计算机上运行良好。 (同一网络)

这提出了两个问题:

1。)我可以(以及如果,如何?)处理来自主线程的任何级别的嵌套线程中出现的异常?

2.。)它是什么类型的文件,没有找到(关于这两行代码)? Localy它工作正常(soure位于网络共享上),但是从我的服务器执行时我得到了这个例外(使用SAME网络共享中的SAME)


刚刚使用了一些MessageBoxes来调试这些东西......最终它看起来如下:

public class class1{
   private void SomeThread(){
       MessageBox.Show("before con");
       DbCon dc = new DbCon();
       MessageBox.Show("after con");
   }
}

  public class DbCon{
      public DbCon(){
             MessageBox.Show("inside");
             String connectionString = "server=" + cfg.DatabaseServer + ";user=" + cfg.DatabaseUser + ";database=" + cfg.DatabaseName + ";port=" + cfg.DatabasePort + ";password=" + cfg.DatabasePassword + ";";
             mysqlConnection = new MySqlConnection(connectionString);
      }
   }

我收到消息“之前con” - 然后抛出异常......就像它只是找不到DbCon - 类 - 但这是可执行文件的一部分 - 并且无法触发{{ 1}} ?? !! (和在本地机器上工作:-()...

1 个答案:

答案 0 :(得分:1)

1)是的,你可以 - 尽管强烈建议使用它,你可以随时通过挂钩FirstChanceException Event来捕捉任何异常。

AppDomain.Current.FirstChanceException += (sender, e) => { ... };

请注意,这也将触发随后处理的异常,包括由.NET处理的异常,并且可能会使应用程序速度降低一些。通常不建议这样做,但它会完全捕获应用程序托管代码中所有内容,无论是在程序集内部还是外部,都可以通过它进行调试。

编辑:如果您希望尽可能简单地附加它,请将Main放入静态类,并将事件挂钩到静态构造函数中。这迫使它如此早地发生,它可以抢占DLL负载。

2)假设您从文件加载配置,有很多原因导致无法找到文件。

  • 如果您正在服务器上执行,请确保该程序以管理员身份运行或具有访问文件系统所需的权限。这是网络共享上的常见问题
  • 确保您没有尝试使用本地路径引用该文件,例如“C:\ ProgramData”或“%ProgramData%”,因为它们将查看正在执行的计算机的C驱动器。
  • 如果您正在使用GAC中的任何DLL,请将它们复制到输出文件夹中 - 如果服务器没有加载文件或者版本不同,这可能会导致异常(尽管通常这是DllNotFoundException)加载。

如果您有权访问,还可以尝试远程访问服务器并在本地进行调试,因为这有助于揭示实际部署环境的问题。 debug on a remote machine还有一些方法可能对您的情况有用。