【问题标题】:Catching all crashes in C# .NET捕获 C# .NET 中的所有崩溃
【发布时间】:2011-10-16 19:41:25
【问题描述】:

在 Stack Overflow 上已经有一些关于这个主题的非常好的主题,但似乎并没有一个简洁的答案。我的 C# 控制台应用程序(作为 Windows 服务运行)启动 Java 进程并对其进行管理(启动/停止/重新启动它),但我的问题是我将远程进入机器,并且有时会看到它启动了大约 20 个 Java 进程。

这显然是我的应用程序在某些时候崩溃的问题,并且没有关闭它启动的 Java 进程。我在 AppDomain.CurrentDomain 中挂上了“UnhandledExceptionEventHandler”,并从中调用 TerminateProcess()(关闭活动的 Java 进程),但这个问题仍然偶尔发生。

我的应用程序有一个主线程、一个 TCP 服务器线程(它接受异步连接)和一个 UDP 服务器线程。在 UnhandledException 之上还有什么我应该挂钩的吗?

编辑

我还突然想到,我的代码中有一些 Try/Catch 块,它们只是写入控制台,而我从未见过。我应该删除这些以便它们被 UnhandledException 捕获还是在那里添加一个记录器?

【问题讨论】:

  • 这是 a) Winforms 应用程序,b) WPF 应用程序,c) 控制台应用程序,d) ASP.NET Web 应用程序吗?这些类型之间的异常处理(在“全局”范围内)完全不同 - 知道您的应用程序是哪一个至关重要。
  • 回复:您的编辑 - 一般建议是:如果您无法从异常中恢复,请让它冒泡,或者记录并重新抛出它。不要吞下异常,也不要编写实际上不处理异常情况的 catch 块。
  • 作为服务运行的控制台应用程序,抱歉。
  • 梅林,如果你想回答我会接受,谢谢!如何从 catch 块中重新抛出异常?
  • 只有一个 thow 会重新抛出。

标签: c# .net try-catch custom-exceptions


【解决方案1】:

首先,如果您不想记录,则必须将代码中的 Console.WriteLine.. 行更改为 Debug.WriteLine..,因此它的输出只会在调试时。

如果您不知道如何处理或修复它,那么当发生任何异常时,然后在记录后重新抛出它catch { throw; }。我个人认为

try
{
    ...
}
catch (Exception exception)
{
    Log(exceptiosn);//log it first or Debug.WriteLine...
#if DEBUG
    System.Diagnostics.Debugger.Break();//break at the debugger here.
#endif//DEBUG
    throw;
} 

在你清理完你的代码之后,现在你可以在DomainUnhandledException 抛出的任何时候,重新启动你的应用程序。一个例子是here,这个想法是你从你的应用程序中启动一个新实例,然后终止第一个实例。您还定义了一个互斥锁,因此每次只有一个实例处于活动状态。

【讨论】:

    【解决方案2】:

    需要考虑的是您是否希望 .NET 应用程序负责生成的进程。如果可能,他们可能会在不再接收输入时负责关闭。如果生成的进程正在其他机器上运行,我无论如何都会尝试这样做,因为网络问题可能会干扰从 .NET 应用程序向 Java 进程发送关闭消息。每个人都有自己的责任。

    也就是说,修复 .NET 应用程序中的异常处理(尤其是当您遗漏一些异常时)也很重要。让每个线程对其异常负责,并确保记录它们以便于调试。

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2014-09-28
      • 2017-07-04
      相关资源
      最近更新 更多