12,796
回編集
294行目: | 294行目: | ||
.Select(f => new { File = f.File, Hash = SHA256.Create().ComputeHash(f.Data)}) // 処理B(ハッシュ値計算) | .Select(f => new { File = f.File, Hash = SHA256.Create().ComputeHash(f.Data)}) // 処理B(ハッシュ値計算) | ||
.ToArray(); | .ToArray(); | ||
</syntaxhighlight> | |||
<br><br> | |||
== 例外処理 == | |||
<code>Task</code>クラスや<code>Parallel</code>クラスで発生する例外は、例外<code>AggregateException</code>としてキャッチすることができる。<br> | |||
<syntaxhighlight lang="c#"> | |||
try | |||
{ | |||
Parallel.Invoke( | |||
() => throw new ArgumentException(), | |||
() => throw new InvalidOperationException(), | |||
() => throw new FormatException() | |||
); | |||
} | |||
catch (AggregateException exception) | |||
{ | |||
// 原因となるExceptionを確認する場合、FlattenメソッドのInnerExceptionsプロパティを使用する | |||
var exceptions = exception.Flatten().InnerExceptions; | |||
foreach (var ex in exceptions) | |||
{ | |||
Debug.WriteLine(ex.GetType()); | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
ただし、<code>Task</code>クラスを<code>await</code>する場合、個別の<code>Exception</code>クラスを使用してキャッチすることもできる。<br> | |||
<syntaxhighlight lang="c#"> | |||
try | |||
{ | |||
var addresses = await Dns.GetHostAddressesAsync("example.jp"); | |||
} | |||
catch(SocketException exception) | |||
{ | |||
Debug.WriteLine(exception.ToString()); | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
<code>Task</code>クラスで発生したキャッチされていない例外をまとめて処理する場合、<code>TaskScheduler.UnobservedTaskException</code>メソッドを使用する。<br> | |||
<syntaxhighlight lang="c#"> | |||
TaskScheduler.UnobservedTaskException += (sender, e) => | |||
{ | |||
AggregateException ae = e.Exception; | |||
Debug.WriteLine(ae.ToString()); | |||
e.SetObserved(); // .NET Framework 4.0の場合、これを記述しないとソフトウェアが強制終了する | |||
}; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> |