2014-02-20 57 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的最後(最外層)異常處理程序中啓動一個新實例。

但是,這些都應視爲解決方案,作爲服務實施。

相關問題