Rumah >pembangunan bahagian belakang >C++ >Bolehkah Pengecualian yang Dilemparkan dalam Kaedah Tidak Sah Async Ditangkap dengan Kaedah Panggilan?
Pengendalian pengecualian kaedah void
tak segerak
Apabila menggunakan Async CTP Microsoft untuk pengaturcaraan tak segerak, adalah penting untuk memahami tingkah laku pengendalian pengecualian kaedah void
tak segerak. Pertimbangkan senario berikut:
<code class="language-csharp">public async void Foo() { var x = await DoSomethingAsync(); } public void DoFoo() { try { Foo(); } catch (ProtocolException ex) { // 异常将永远不会被捕获。 } }</code>
Persoalannya ialah: Bolehkah pengecualian yang dilemparkan dalam kaedah tak segerak DoFoo
ditangkap dalam kaedah panggilan Foo
?
Jawapan: Ya (tetapi ada prasyarat)
Pengecualian akan menggelegak ke kod panggilan, tetapi hanya jika anda memerlukan panggilan ke await
atau Wait()
Foo
. Ubah suai kod seperti berikut:
<code class="language-csharp">public async Task Foo() { var x = await DoSomethingAsync(); } public async void DoFoo() { try { await Foo(); } catch (ProtocolException ex) { // 异常将被捕获,因为它是一个异步方法。 } } public void DoFoo() { try { Foo().Wait(); } catch (ProtocolException ex) { // 异常将被捕获,因为调用被等待。 } }</code>
Ini membenarkan pengendalian pengecualian dalam kod panggilan.
Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa Stephen Cleary, pihak berkuasa mengenai pengaturcaraan tak segerak, memberi amaran:
KaedahSelain itu, menggunakan"Async
void
mempunyai semantik pengendalian ralat yang berbeza. Apabila pengecualian dilemparkan daripada kaedah asyncTask
atau asyncTask<T>
, pengecualian akan ditangkap dan diletakkan pada objekTask
. Betul Untuk kaedah asyncvoid
, tiada objekTask
, jadi sebarang pengecualian yang dilemparkan daripada kaedah asyncvoid
akan dibangkitkan terus padavoid
yang aktif apabila kaedah asyncSynchronizationContext
dimulakan.
untuk menunggu tugasan selesai mungkin menyekat aplikasi jika .NET memutuskan untuk melaksanakan kaedah secara serentak. Wait()
Atas ialah kandungan terperinci Bolehkah Pengecualian yang Dilemparkan dalam Kaedah Tidak Sah Async Ditangkap dengan Kaedah Panggilan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!