Rumah >pembangunan bahagian belakang >C++ >Bolehkah Pengecualian yang Dilemparkan dalam Kaedah Tidak Sah Async Ditangkap dengan Kaedah Panggilan?

Bolehkah Pengecualian yang Dilemparkan dalam Kaedah Tidak Sah Async Ditangkap dengan Kaedah Panggilan?

Barbara Streisand
Barbara Streisandasal
2025-01-24 02:43:10432semak imbas

Can Exceptions Thrown in Async Void Methods Be Caught by Calling Methods?

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:

Kaedah

"Async void mempunyai semantik pengendalian ralat yang berbeza. Apabila pengecualian dilemparkan daripada kaedah async Task atau async Task<T>, pengecualian akan ditangkap dan diletakkan pada objek Task. Betul Untuk kaedah async void, tiada objek Task, jadi sebarang pengecualian yang dilemparkan daripada kaedah async void akan dibangkitkan terus pada void yang aktif apabila kaedah async SynchronizationContext dimulakan.

Selain itu, menggunakan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn