Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

จะตรวจจับข้อยกเว้นที่เกิดจากวิธี async void ใน C # ได้อย่างไร


ในโค้ด C# แบบซิงโครนัส ข้อยกเว้นจะแพร่กระจายไปยังสแต็กการโทรจนกว่าจะถึงบล็อก catch ที่เหมาะสมซึ่งสามารถจัดการกับข้อยกเว้นได้ อย่างไรก็ตาม การจัดการข้อยกเว้นในวิธีอะซิงโครนัสนั้นไม่ตรงไปตรงมา

เมธอดแบบอะซิงโครนัสใน C# สามารถมีค่าส่งคืนได้สามประเภท:โมฆะ งาน และงาน เมื่อมีข้อยกเว้นเกิดขึ้นในเมธอด async ที่มีประเภทส่งคืนของงานหรืองาน ออบเจ็กต์ข้อยกเว้นจะถูกรวมไว้ในอินสแตนซ์ของ AggregateException และแนบกับวัตถุงาน

หากมีข้อยกเว้นหลายข้อ ข้อยกเว้นทั้งหมดจะถูกเก็บไว้ในวัตถุงาน

ตัวอย่างที่ 1

static async Task Main(string[] args) {
   await DoSomething();
   Console.ReadLine();
}
public static async Task Foo() {
   throw new ArgumentNullException();
}
public static async Task DoSomething(){
   try{
      await Foo();
   }
   catch (ArgumentNullException ex){
      Console.WriteLine(ex);
   }
}

ผลลัพธ์

System.ArgumentNullException: Value cannot be null.
at DemoApplication.Program.Foo() in C:\Users\Koushik\Desktop\Questions\ConsoleApp\Program.cs:line 37
at DemoApplication.Program.DoSomething() in C:\Users\Koushik\Desktop\Questions\ConsoleApp\Program.cs:line 44