簡體   English   中英

當線程得到未處理的異常時,CLR退出

[英]CLR exits when a thread gets unhandled exception

我的應用程序中有后台線程。 當其中一個線程獲得未處理的異常時,整個CLR退出。

這是正常的行為,還是CLR中的錯誤?

我希望線程會退出,但CLR將繼續工作。

.NET應用程序中的默認行為是在發生未處理的異常時退出。 當異常未處理時,程序處於未知且可能不穩定的狀態。 僅僅因為它發生在后台線程中並不意味着錯誤不會影響程序的其余部分。 在這種情況下,運行時最謹慎的做法是轉儲程序。

您可能會查看AppDomain.CurrentDomain.UnhandledException ,它將允許您捕獲未處理的異常並做出相應的反應。 一個更好的解決方案是使用try...catch包裝你的線程proc。 但只有它處理它知道如何處理的異常。 這樣做:

void MyThreadProc()
{
    try
    {
        // ... 
    }
    catch
    {
        // handle all exceptions
        // This is a BAD idea
    }
}

這是一個非常糟糕的主意,因為它可以掩蓋您確實希望傳播到主程序的異常。

您的預期行為曾經是1.1中的行為。 人們普遍認為這是一個壞主意。 當您在任何線程中有未處理的異常時,您的進程可能會處於不一致狀態。 可以部分應用對共享數據的更新等。運行時沒有安全處理此方案的信息,甚至不知道如何處理此方案,因此它的選擇將等於終止線程並使程序保持不變一個奇怪的國家。 這可能導致資源泄漏,掛起,數據損壞等。通過在給定未處理的異常的情況下終止進程,您確切知道發生了什么,該過程結束。

是的,這是正常的,你可以看到這個類似的問題更詳細。

這是CLR從v2.0開始的正常行為。 這是關於此的MSDN帖子。 為了避免進程終止,你可以使用這樣的東西

<legacyUnhandledExceptionPolicy enabled="1"/>

這是不可取的。

這是正常的行為。 也許您希望捕獲異常以防止應用程序退出。

暫無
暫無

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

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