2009-06-12 86 views
7

我一直在使用谷歌瀏覽器一段時間,我注意到它具有非常優雅的崩潰控制功能。預測程序崩潰

就在崩潰之前,谷歌瀏覽器給出了一條消息:「哇!谷歌瀏覽器崩潰了,現在重新啓動?」。之後,我會得到一個標準的Windows XP「這個程序遇到了問題,需要關閉。」與「調試」,「不發送」和「發送錯誤報告」按鈕。

我的問題是你如何編程你的編譯應用程序來提前檢測到崩潰情況?如果你在任何編程語言/平臺上知道如何做到這一點,那就太棒了。

感謝

+6

第一眼看到這個問題,我想知道這是否會解決Google是否解決了暫停問題...... – 2009-06-12 20:51:45

回答

16

谷歌Chrome瀏覽器使用的技術(通常被稱爲過程分離),其中「主機」界面管理子進程,它可以檢測不響應(或更糟的是,拋出一個錯誤和關閉)。它會爲您打開的每個選項卡啓動一個新的過程。

Here's an article更詳細地描述了這一點。

使用.net的Process類,您可以啓動進程,檢查它們是否響應,甚至殺死它們。

如果您想在您自己的窗口中嵌入進程窗口,可以使用平臺函數(如SetParent)將窗口移到另一個窗口中。恐怕在使用窗體時,我並沒有意識到SetParent的託管替代方案,但我懷疑存在,因此在使用SetParent之前值得搜索。

如果主機進程崩潰,只需使用諸如AppDomain.CurrentDomain.UnhandledException之類的東西就可以接收到發生頂級異常的通知,但到目前爲止,您不可能預測您的內部對象的狀態應用程序和重新啓動(以及一些日誌記錄和通知給用戶)可能是您唯一明智的選擇。

處理頂級例外是covered in detail here

4

在.NET中,您可以連接到System.AppDomain.CurrentDomain.UnhandledException事件。你的代碼看起來像這樣:

using System; 
using System.Windows.Forms; 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.UnhandledException += MyUnhandledExceptionHandler; 

     // start rest of application 
    } 

    private static void MyUnhandledExceptionHandler(object sender, EventArgs args) 
    { 
     MessageBox.Show("Your app is crashing. Watch out!"); 
    } 
} 
+0

不錯 - 我總是喜歡在有人回答問題時看到一些代碼示例。 – 2009-11-11 14:52:24

+0

您需要做的不止於此,請參閱http://www.danielmoth.com/Blog/2004/08/global-exception-handling-net-v11-part.html – mhenry1384 2009-12-18 14:31:05

12

我不知道谷歌的代碼,所以我猜測。谷歌瀏覽器可能不會預測它會崩潰,但檢測到它已經崩潰。

在Windows中,您可以通過爲所有未處理的異常提供處理程序來完成此操作。在此處理程序中,您可能會執行諸如重新啓動應用程序,創建小型文件轉儲文件等。

請查看SetUnhandledExceptionFilter Function獲取一種方法。