12,796
回編集
(→例外処理) |
|||
366行目: | 366行目: | ||
e.SetObserved(); // .NET Framework 4.0の場合、これを記述しないとソフトウェアが強制終了する | e.SetObserved(); // .NET Framework 4.0の場合、これを記述しないとソフトウェアが強制終了する | ||
}; | }; | ||
} | |||
</syntaxhighlight> | |||
<br> | |||
上記の例外処理において、以下のようなメソッドを記述すると便利である。<br> | |||
<code>ValueTask</code>構造体ではなく<code>Task</code>クラスでもよいが、<code>ValueTask</code>構造体にすることにより、アロケーションコストを削減できる可能性がある。<br> | |||
<syntaxhighlight lang="c#"> | |||
public void Button_Click(object sender, EventArgs e) | |||
{ | |||
SafeAsyncBlock(async () => | |||
{ | |||
// 非同期で取得 | |||
var body = await httpClient.GetStringAsync("https://example.com/foobar"); | |||
var foobar = JsonConvert.DeserializeObject<FooBar>(body); | |||
// 表示 | |||
textBox.Text = $"${foobar.Price}"; | |||
}); | |||
} | |||
// 非同期処理で発生する例外を安全に処理する | |||
public static async void SafeAsyncBlock(Func<ValueTask> action) | |||
{ | |||
try | |||
{ // 非同期処理を実行 | |||
await action(); | |||
} | |||
catch (Exception ex) | |||
{ // 未処理の例外を補足する | |||
Trace.WriteLine($"Log: {ex}"); | |||
} | |||
catch | |||
{ // SEHも補足 | |||
Trace.WriteLine("Log: Caught uninterpreted exception."); | |||
} | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> |