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
?? ?!
1)是的,您可以-尽管强烈建议不要使用它,但您可以通过挂钩到FirstChanceException事件在任何时候捕获任何异常。
AppDomain.Current.FirstChanceException += (sender, e) => { ... };
注意,这也会触发异常,然后处理,包括那些由。net在底层处理,可能会减慢你的应用程序。通常不推荐使用,但它绝对可以捕获应用程序托管代码中抛出的所有内容,包括程序集内部和外部,使其绝对适合调试。
编辑:如果你想要尽可能快地附加这个,把你的Main放到一个静态类中,把事件钩子放到一个静态构造函数中。这迫使它提前发生,它可以抢占DLL加载。
2)如果你从文件中加载配置,它找不到文件的原因有很多。
- 如果您在服务器上执行,请确保程序以管理员身份运行,或者具有访问文件系统所需的权限。这是网络共享 上的常见问题。请确保您没有尝试使用本地路径引用文件,例如"C:'ProgramData"或"%ProgramData%",因为这些将查看执行机器的C驱动器。
- 如果您正在使用GAC中的任何dll,请将它们复制到输出文件夹中-如果服务器没有加载文件或加载了不同的版本,这可能会导致异常(尽管通常这是DllNotFoundException)。
如果您有访问权限,还可以尝试远程连接到服务器并在本地调试,因为这有助于揭示实际部署环境中的问题。还有一些方法可以在远程机器上进行调试,这些方法可能对您的情况很有用。