c# - 捕获 C# .NET 中的所有崩溃

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

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

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

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

编辑

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

最佳答案

首先,如果您不想记录,则必须将代码中的 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 ,这个想法是您从您的应用程序启动一个新实例,然后终止第一个实例。您还定义了一个互斥体,因此一次只有一个实例会存活。

关于c# - 捕获 C# .NET 中的所有崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6888172/

相关文章:

c# - 为什么不在 ContinueWith 中执行任务?

c# - 如何使用反射调用自定义运算符

c# - 如何生成不寻常但数学上有效的 RSA key ?

javascript try catch vs if then else

.net - 将频繁的文件 I/O 操作放在 SyncLock block 中是一个坏主意吗?

c# - Asp.net SessionID 的字符串格式是什么?

c# - Asp.Net C# 调用单个验证器

c# - 将连接设置文件传递到 DatabaseProviderFactory、Ent 库

c# - 程序从控制台正常运行,但不能从 Windows 服务运行

javascript - 抛出错误并使用finally block 发送错误代码500