C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で非同期voidメソッドによってスローされた例外をキャッチするにはどうすればよいですか?


同期C#コードでは、例外は、例外を処理できる適切なcatchブロックに到達するまで、コールスタックに伝播されます。ただし、非同期メソッドでの例外処理はそれほど単純ではありません。

C#の非同期メソッドには、void、Task、およびTaskの3種類の戻り値があります。戻り型がTaskまたはTaskの非同期メソッドで例外が発生すると、例外オブジェクトはAggregateExceptionのインスタンスにラップされ、Taskオブジェクトにアタッチされます。

複数の例外がスローされた場合、それらはすべてTaskオブジェクトに格納されます。

例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

  1. PythonでIOError例外をキャッチする方法は?

    IOError例外 存在しないファイルを開こうとしたときのprintステートメントやopen()関数など、入出力操作が失敗したときに発生するエラーです。また、オペレーティングシステム関連のエラーに対しても発生します。 指定されたコードがtryブロックで記述されている場合、入出力例外が発生します。これは、以下に示すように、exceptブロックで処理されます。 例 import sys def whatever(): try: f = open ( "foo.txt", 'r' ) except IOError, e: print e print sys.

  2. PythonでKeyError例外をキャッチする方法は?

    辞書のキーとして値が見つからない場合、KeyErrorが発生します。指定されたコードは、例外をキャッチしてそのタイプを見つけるために次のように書き直されます。 例 import sys try: s = {'a':5, 'b':7}['c'] except: print (sys.exc_info()) 出力 (<type 'exceptions.KeyError'>, KeyError('c',), <traceback object at  0x0000000003203748&g