Pertanyaan CLR keluar ketika sebuah thread mendapat pengecualian yang tidak tertangani


Saya memiliki latar belakang utas di aplikasi saya. Ketika salah satu untaian mendapatkan pengecualian yang tidak menangani seluruh keluar CLR.

Apakah itu perilaku normal, atau itu bug di CLR?

Saya berharap bahwa benang akan keluar tetapi CLR akan terus bekerja.


5
2018-01-30 15:25


asal


Jawaban:


Perilaku default dalam aplikasi .NET adalah untuk keluar setiap kali pengecualian yang tidak ditangani terjadi. Ketika pengecualian tidak ditangani, program ini dalam keadaan yang tidak diketahui dan mungkin goyah. Hanya karena itu terjadi di thread latar belakang tidak berarti bahwa kesalahan tidak akan mempengaruhi sisa program. Kursus yang paling bijaksana untuk runtime dalam situasi itu adalah membuang program.

Anda mungkin melihat ke dalam AppDomain.CurrentDomain.UnhandledException, yang akan memungkinkan Anda untuk menangkap pengecualian yang tidak tertangani dan bereaksi sesuai. Solusi yang lebih baik adalah membungkus proc thread Anda dengan a try...catch. Tetapi hanya menangani pengecualian itu yang tahu cara mengatasinya. Melakukan ini:

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

Adalah ide yang sangat buruk, karena dapat menutupi pengecualian yang benar-benar Anda inginkan untuk disebarkan ke program utama.


7
2018-01-30 15:36



Perilaku yang Anda harapkan digunakan untuk menjadi perilaku di 1.1. Secara umum dianggap sebagai ide yang buruk. Bila Anda memiliki pengecualian yang tidak tertangani di utas apa pun, proses Anda dapat ditinggalkan dalam keadaan yang tidak konsisten. Pembaruan data bersama dapat diterapkan sebagian, dll. Runtime tidak memiliki informasi untuk menangani skenario ini dengan aman, atau bahkan mengetahui bagaimana Anda ingin menangani skenario ini, sehingga pilihannya akan mengakhiri rangkaian dan meninggalkan program Anda di sebuah negara yang aneh. Hal ini dapat menyebabkan kebocoran sumber daya, hang, korupsi data, dll. Dengan menghentikan proses yang diberikan pengecualian yang tidak tertangani Anda tahu persis apa yang terjadi, prosesnya berakhir.


4
2018-01-30 15:32



ya itu normal dan Anda bisa melihat ini serupa pertanyaan untuk lebih detail.


1
2018-01-30 15:31



Ini adalah perilaku normal CLR dari v2.0. Ini dia MSDN posting ini. Untuk menghindari proses dari penghentian Anda dapat menggunakan sesuatu seperti ini

<legacyUnhandledExceptionPolicy enabled="1"/>

yang tidak dianjurkan.


1
2018-01-30 15:31



Itu perilaku normal. Mungkin Anda ingin menangkap pengecualian untuk mencegah aplikasi keluar.


0
2018-01-30 15:30