Rumah >pembangunan bahagian belakang >C++ >Bolehkah Aplikasi .NET 4.5 Mentakrifkan Pengendali Pengecualian Global untuk Pengecualian Tugas Async?
Penerokaan mengenai mekanisme pengendalian pengecualian tugas tak segerak global
Dengan pengenalan pengaturcaraan tak segerak dalam .NET 4.5, persoalan utama telah timbul: Bolehkah aplikasi menentukan pengendali pengecualian global untuk menangkap pengecualian yang dilemparkan dalam kaedah Tugas tak segerak?
Mekanisme penyebaran pengecualian dalam tugas tak segerak
Pengecualian yang berlaku dalam kaedah Tugas tak segerak mesti dipatuhi oleh kod yang mengendalikan penyiapan tugas. Sekiranya tugas itu tidak dipatuhi, pengecualian akan menjadi tidak aktif.
Sebagai contoh coretan kod:
<code>string x = await DoSomethingAsync();</code>
Jika DoSomethingAsync melemparkan pengecualian, ia hanya akan diperhatikan apabila mengendalikan ekspresi menunggu, seperti meletakkan kod dalam blok cuba-tangkap. Kegagalan untuk mematuhi pengecualian menyebabkan pengecualian tidak dikendalikan dan mungkin diabaikan.
AppDomain dan pengecualian tugas yang tidak diperhatikan
.NET 4.5 menyediakan dua acara untuk mengendalikan pengecualian yang tidak diperhatikan:
Acara UnhandledException biasanya digunakan untuk mengendalikan pengecualian yang tidak diperhatikan dalam kod segerak. Walau bagaimanapun, pengecualian untuk Tugas tak segerak lazimnya dikendalikan oleh acara UnobservedTaskException apabila tugasan mencuba kutipan sampah.
Dayakan UnhandledException untuk tugas tak segerak
Secara lalai, .NET 4.5 tidak menyalakan acara UnhandledException untuk pengecualian tugas tak segerak yang tidak diperhatikan. Tingkah laku ini boleh diubah dengan menetapkan sifat ThrowUnobservedTaskExceptions kepada benar dalam fail konfigurasi aplikasi.
Kaedah lompang tak segerak
Tingkah laku pengendalian pengecualian adalah berbeza untuk kaedah lompang tak segerak. Oleh kerana tiada rujukan tugasan untuk diperhatikan, pengecualian segera dilemparkan dalam konteks penyegerakan semasa. Dalam WPF, ini boleh menyebabkan satu siri acara dicetuskan, termasuk Dispatcher.UnhandledException, dan boleh menyebabkan aplikasi ranap. Memandangkan tiada tugas, TaskScheduler.UnobservedTaskException tidak dicetuskan dalam kes ini.
Ringkasan
Walaupun mungkin untuk menentukan pengendali pengecualian global untuk pengecualian tidak diperhatikan segerak, gelagat pengecualian yang dilemparkan dalam kaedah Tugas tak segerak adalah lebih bernuansa. Adalah penting untuk memahami cara pengecualian ini menyebarkan dan mengendalikannya dengan sewajarnya untuk mengelakkannya daripada tidak diperhatikan dan menyebabkan gelagat aplikasi yang tidak dijangka.
Atas ialah kandungan terperinci Bolehkah Aplikasi .NET 4.5 Mentakrifkan Pengendali Pengecualian Global untuk Pengecualian Tugas Async?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!