Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C“捕捉例外情况”;“主线程”;_C#_Mysql_Multithreading_Filenotfoundexception - Fatal编程技术网

C# C“捕捉例外情况”;“主线程”;

C# C“捕捉例外情况”;“主线程”;,c#,mysql,multithreading,filenotfoundexception,C#,Mysql,Multithreading,Filenotfoundexception,我有一个应用程序,设计为在24/7服务器上运行。经过本地测试,一切工作正常,符合预期。部署到Windows Server 2012 R2-每当主任务(线程化)启动时,我都会收到一个异常 在服务器上,我显然没有Visual Studio,因此无法调试ig。我刚刚看到一个丑陋的Windows对话框,声明“{ApplicationName}已停止工作。” 在EventViewer中,我找到一个条目,指示错误的位置 事件日志显示: Application: MyApplicationBackend.ex

我有一个应用程序,设计为在24/7服务器上运行。经过本地测试,一切工作正常,符合预期。部署到Windows Server 2012 R2-每当主任务(线程化)启动时,我都会收到一个异常

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

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

事件日志显示:

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.是一个单例,保存配置值):

  • 已安装MySQL Connector.Net 6.8.3
  • 代码将连接到远程数据库(本地网络)
  • 代码在我的本地机器上运行得很好。(同一网络)
这提出了两个问题:

1.)我可以(如果,如何)处理主线程中任何级别的嵌套线程中出现的异常吗

2.)找不到哪种类型的文件(关于这两行代码)?本地运行良好(资源位于网络共享上),但从服务器执行时,我会遇到此异常(使用来自同一网络共享的同一可执行文件)


只是用了一些MessageBox来调试这些东西。。。最终看起来如下所示:

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

我收到消息“before con”-然后抛出异常。。。就像它只是找不到
DbCon
-类-但这是可执行文件的一部分-并且无法触发
文件未找到异常
??!!(并在本地计算机上工作:-()…

1)是的,您可以-尽管强烈建议不要使用它,但您可以通过挂接到

注意,这也会触发随后处理的异常,包括由.NET在引擎盖下处理的异常,并且可能会使应用程序的速度减慢一点。通常不推荐使用它,但它绝对可以捕获应用程序的托管代码中抛出的所有内容,无论是在程序集内部还是外部,这使得使用它进行调试非常出色

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

2) 假设您从文件加载配置,它找不到文件的原因有很多

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

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

可能
cfg
试图从文件中读取其配置,但服务器上缺少该文件?@Medo42,已确认该文件可以正常工作。(是的,singleton正在读取一个文件,但我在应用程序启动时读取了该文件,并且只在应用程序关闭时回写)下一次尝试,可能它找不到
MySqlConnection
类?由于执行看起来并没有到达实际的构造函数代码,但是调用构造函数之前的所有操作都完成了,因此它可能无法加载在那里引用的类。同样,如果
mysqlconnection
属于
mysqlconnection
类型,那么它可能已经在cctor中失败了…@Medo42是的,
mysqlconnection
是私有成员。这可以解释为什么它实际上在Ctor调用之前失败,但在Ctor调用之后失败。将检查mysql连接器在该系统上的安装和引用。@Shiva它正在初始化其成员-
mysqlConnection
只是一个私有成员。连接刚刚初始化,没有连接。(我知道这个答案很旧,但是)。。。FirstChanceException事件:“尽管强烈建议不要使用它”——由谁发起,为什么?(因为我目前正在调查。)@MartinBa的使用在这个案例中是我自己强烈反对的(我见过的大多数其他人都提到了这一点)。这是因为,虽然它可能对调试有用,但它也有上面提到的“捕获所有内容”问题,并且文档列出了一些严重的损坏,如果处理程序本身遇到异常。命中已处理异常的可能性也很高,因此当我在生产代码中激活它时,通常只在复制错误之前激活断点,而不是在程序启动时。
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);
      }
   }
AppDomain.Current.FirstChanceException += (sender, e) => { ... };