簡體   English   中英

如何在未處理的異常后繼續運行?

[英]How do I continue running after an unhandled exception?

我的應用程序中有以下代碼在未處理的異常之后運行:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            var exception = e.ExceptionObject as Exception;
            if (exception != null) MessageBox.Show(exception.Message + " - " + exception.StackTrace);
        }

但即使我抓住未處理的異常我的Windows移動應用程序關閉。 當我捕獲未處理的異常時如何防止關閉應用程序。 我永遠不想關閉我的應用程序。 我想在這個場景中打開登錄表單或其他任何不關閉應用程序的表單。

所以我想要的是防止關閉應用程序從未處理的異常,如網絡關閉,...

我不能在每個代碼中使用try catch ....

知道如何在網絡中斷或任何其他未處理的異常時阻止關閉應用程序嗎?

你沒有。 當您收到AppDomain未處理的異常時,您的應用不再處於穩定狀態。 你究竟要回到哪里? 當你已經達到這一點時,你唯一的理由就是退出。 您可以合理地安排自己再次運行以確保應用程序返回,但更好的想法是在其源處實際處理異常並防止它成為UnhandledException。

在app.config中添加以下元素

<runtime>
  <!-- the following setting prevents the host from closing when an unhandled exception is thrown -->
  <legacyUnhandledExceptionPolicy enabled="1" />
</runtime>

您可以,並且應該使用try...catch並在可能發生異常的每種情況下處理異常。 (在像Java這樣的語言中,你甚至無法編譯代碼,直到你捕獲被調用函數可能拋出的每個異常或明確聲明這個特定函數不會捕獲它,因此調用它的那個應該這樣做。)

如果你想最小化你使用try...catch情況,如果滿足必要的條件,可以通過測試防止一些不良情況,這樣你甚至不會調用一個已知的拋出特定異常的函數。 喜歡打電話

if (myByteArray != null)
{
    myIPAddress = new IPAddress(myByteArray);
}

因為這樣, IPAddress構造函數不會拋出ArgumentNullException

然而,在大多數情況下,這是無法做到的,尤其是在網絡方面,因為您無法預測電纜是否會被切斷,信號是否會丟失,數據庫服務器是否會在交易過程中粉碎等等。 因此,每次連接到網絡或向連接發送數據或從連接接收數據時,都應該try...catch

AppDomain.CurrentDomain.UnhandledException觸發任何線程上的任何未處理的異常,但自CLR 2.0起,CLR會在事件處理程序完成后強制關閉應用程序。 但是,您可以通過將以下內容添加到應用程序配置文件來阻止關閉:

<configuration>
  <runtime>
    <legacyUnhandledExceptionPolicy enabled="1" />
  </runtime>
</configuration>

我認為你需要使用Application.ThreadException當你訂閱Application.ThreadException時 ,未處理的異常不會觸及UnhandledException ,應用程序將繼續運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM