2014-02-20 56 views
0

我有一个exe文件(比如说A),它负责向员工发送电子邮件。 在某些时候可能是因为某些错误未被处理,所以会在下面的对话框中引发运行时错误。运行时错误 - 内部或外部的进程处理

“在MainApplication.exe中发生类型为”System.IndexOutOfRangeException“的未处理异常”。

保持原样,除非有人进入服务器并重新启动应用程序。 我明白,通过做错误处理这可以照顾仍然我希望替代解决方案自动杀死此过程并重新启动它。

我做了另一个应用程序B - System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.FileName = @“..... \ MainApplication.exe”;

我试图找出是否发生任何运行时错误,然后我可以终止进程并重新开始。

1)exe中是否有任何规定可以终止进程并自动删除此对话框的代码? 2)如果不可能,则可以使用其他应用程序B来捕获和终止该进程。

任何其他建议也欢迎! 感谢您的帮助。

回答

1

看门狗的问题是他们自己很容易失败。如果您在应用程序A中遇到未处理的异常,是什么让您认为您在应用程序B中不会遇到相同的情况?

你应该考虑是适当挂钩未处理的异常事件:

来处理这些事件的正确方法,以及事件适用于这种情况,是一个相当长的话题。阅读上面的链接了解更多详情。还读了关于Application.SetUnhandledExceptionMode

通过捕获这些未处理的异常,您可以通过显式地退出来抑制默认的对话框行为。传统上还有一个注册表项,请参见How to turn off/disable the .NET JIT Debugging Dialog,但挂钩未处理的异常处理程序事件是一种更好的方法。

+0

谢谢大家的宝贵意见。非常感谢理查德你是对的,这必须在服务器下运行。我会做这个以及永久的解决方案。 –

+0

有一件事情要考虑这些(否则)未被忽略的例外是它们为什么发生的原因:过程的状态仍然有效吗?除非你清楚所有相关的状态在异常后重置,否则你可以做任何事情。最好你会隐藏小的缺陷,最糟糕的是你会腐蚀什么是有效的状态。 – Richard

1

如果A.exe是一个Windows服务(即在.NET中实现其主要类从ServiceBase派生),那么你可以配置它自动重新启动系统。 (请参阅services.msc中服务属性的“恢复”选项卡)。

对于在Windows中长期运行的任何服务是最好的方法,但如果不是这样写的,它可能需要重写。

替代方案:

  • 使用调度运行的东西,看看是否A.exe正在运行,如果不启动它。如果在任何时候只有一个A.exe的实例,这是最简单的。
  • 在退出(并记录失败)之前,在A.exe的最后(最外层)异常处理程序中启动一个新实例。

但是,这些都应视为解决方案,作为服务实施。

相关问题