2017-01-19 14 views
3

.NET 4.6以降では、オブジェクトに新しいメソッドFromExceptionがあり、例外をスローするにはどうすればよいか疑問に思っていました。 async方法非同期メソッド(Task.FromException)で例外をスローする方法

ここでは二つの例:

internal class Program 
{ 
    public static void Main(string[] args) 
    { 
     MainAsync().Wait(); 
    } 

    private static async Task MainAsync() 
    { 
     try 
     { 
      Program p = new Program(); 
      string x = await p.GetTest1(@"C:\temp1"); 
     } 
     catch (Exception e) 
     { 
      // Do something here 
     } 
    } 

    // Using the new FromException method 
    private Task<string> GetTest1(string filePath) 
    { 
     if (!Directory.Exists(filePath)) 
     { 
      return Task.FromException<string>(new DirectoryNotFoundException("Invalid directory name.")); 
     } 
     return Task.FromResult(filePath); 
    } 

    // Using the normal throw keyword 
    private Task<string> GetTest2(string filePath) 
    { 
     if (!Directory.Exists(filePath)) 
     { 
      throw new DirectoryNotFoundException("Invalid directory name."); 
     } 
     return Task.FromResult(filePath); 
    } 
} 
+1

'async'メソッドに例外をスローする最善の方法は' throw'です。しかし、どちらの例も 'async'メソッドではありません。 –

答えて

3

GetTest1()GetTest2間の動作の違いがあります。

GetTest1()は、メソッドの呼び出し時に例外をスローしません。代わりにTask<string>を返します。そのタスクが待たれるまで例外はスローされません(例外を投げることなく成功したかどうかを調べるためにタスクを検査することもできます)。今まで私は、あなたが希望の動作に依存するであろう使用した1推測Task<string>

を返さずに呼び出されたときのコントラストGetTest2()

はすぐに例外をスローします。 GetTest()のタスクが並行して実行したいと思っていたら、成功したタスクの実行を継続したいのですが、Task.FromExceptionを使用すると、それぞれのタスクの結果を検査してそれに応じて行動することができます。対照的に、リスト内の例外が実行を続行したくないという意味であれば、例外をスローする可能性が高いです。

+0

最後の段落は意味をなさない。 'Task.FromException'は' async'メソッドでは全く使用しないでください。 –

+0

@StephenClearyは問題のある段落を削除しました - それを指摘してくれてありがとう –

+0

@Stephen Clearyどうしてですか? (!Directory.Exists(filePathに)):たとえば、タスク GetTest3(文字列filePathに)非同期 '民間 { があれば { リターンはTask.FromException (新DirectoryNotFoundException() "無効なディレクトリ名を。")待ちます。 } ... } ' – Bidou

関連する問題