c#在主线程上捕获异常

本文关键字:捕获异常 线程 | 更新日期: 2023-09-27 18:12:36

我有一个应用程序,设计用于在24/7服务器上运行。本地测试一切工作顺利,如预期。部署到Windows Server 2012 R2 -我得到一个异常,每当主任务(线程)启动。

在服务器上,我显然没有visual studio,所以我不能调试ig。我只是得到一个丑陋的窗口对话框,说明"{ApplicationName}已经停止工作。"。

在事件查看器中,我发现一个条目,指示错误的位置。

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()

嗯,在 someeclass 的构造函数中没有什么重要的事情发生-只是一个mysql数据库连接,就像这样,(Where cfg. s .)是一个单例,保存Configuration值):

 //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)。什么样的文件可能是,没有找到(关于这2行代码)?本地工作良好(源代码位于网络共享上),但当从我的服务器执行时,我得到这个异常(使用来自相同网络共享的相同可执行文件)


只是使用了一些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);
      }
   }

我收到消息"before con" -然后异常被抛出…就像它只是找不到DbCon - class -但这是可执行文件的一部分-并且无法触发File-Not-Found-Exception ?? ?!

c#在主线程上捕获异常

1)是的,您可以-尽管强烈建议不要使用它,但您可以通过挂钩到FirstChanceException事件在任何时候捕获任何异常。

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

注意,这也会触发异常,然后处理,包括那些由。net在底层处理,可能会减慢你的应用程序。通常不推荐使用,但它绝对可以捕获应用程序托管代码中抛出的所有内容,包括程序集内部和外部,使其绝对适合调试。

编辑:如果你想要尽可能快地附加这个,把你的Main放到一个静态类中,把事件钩子放到一个静态构造函数中。这迫使它提前发生,它可以抢占DLL加载。

2)如果你从文件中加载配置,它找不到文件的原因有很多。

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

如果您有访问权限,还可以尝试远程连接到服务器并在本地调试,因为这有助于揭示实际部署环境中的问题。还有一些方法可以在远程机器上进行调试,这些方法可能对您的情况很有用。