我有一个应用程序,旨在在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);
这提出了两个问题:
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}} ?? !! (和在本地机器上工作:-()...
答案 0 :(得分:1)
1)是的,你可以 - 尽管强烈建议使用它,你可以随时通过挂钩FirstChanceException Event来捕捉任何异常。
AppDomain.Current.FirstChanceException += (sender, e) => { ... };
请注意,这也将触发随后处理的异常,包括由.NET处理的异常,并且可能会使应用程序速度降低一些。通常不建议这样做,但它会完全捕获应用程序托管代码中所有内容,无论是在程序集内部还是外部,都可以通过它进行调试。
编辑:如果您希望尽可能简单地附加它,请将Main放入静态类,并将事件挂钩到静态构造函数中。这迫使它如此早地发生,它可以抢占DLL负载。
2)假设您从文件加载配置,有很多原因导致无法找到文件。
如果您有权访问,还可以尝试远程访问服务器并在本地进行调试,因为这有助于揭示实际部署环境的问题。 debug on a remote machine还有一些方法可能对您的情况有用。