[解決済み】非同期voidメソッドが投げる例外をキャッチする
2022-03-27 04:03:56
質問
Microsoft for .NETのasync CTPを使用しています。 非同期メソッドが投げる例外を呼び出し側メソッドでキャッチすることは可能ですか?
public async void Foo()
{
var x = await DoSomethingAsync();
/* Handle the result, but sometimes an exception might be thrown.
For example, DoSomethingAsync gets data from the network
and the data is invalid... a ProtocolException might be thrown. */
}
public void DoFoo()
{
try
{
Foo();
}
catch (ProtocolException ex)
{
/* The exception will never be caught.
Instead when in debug mode, VS2010 will warn and continue.
The deployed the app will simply crash. */
}
}
つまり、基本的には、非同期コードからの例外を呼び出し側のコードにバブルアップさせたいのです。 は、それが可能であるならば。
どのように解決するのですか?
読むとちょっと変な感じですが、そうです、例外は呼び出し側のコードにバブルアップされます。
もし
await
または
Wait()
を呼び出すと
Foo
.
public async Task Foo()
{
var x = await DoSomethingAsync();
}
public async void DoFoo()
{
try
{
await Foo();
}
catch (ProtocolException ex)
{
// The exception will be caught because you've awaited
// the call in an async method.
}
}
//or//
public void DoFoo()
{
try
{
Foo().Wait();
}
catch (ProtocolException ex)
{
/* The exception will be caught because you've
waited for the completion of the call. */
}
}
Stephen Clearyは、次のように書いています。 Async/Await - 非同期プログラミングのベストプラクティス :
非同期 void メソッドには、異なるエラー処理セマンティクスがあります。非同期タスクまたは非同期タスクメソッドから例外がスローされると、その例外は捕捉されてタスクオブジェクトに配置されます。非同期 void メソッドでは、Task オブジェクトは存在しないので、非同期 void メソッドからスローされる例外は、非同期 void メソッドの開始時にアクティブだった SynchronizationContext で直接発生します。
を使用することに注意してください。
Wait()
は、.NETがメソッドの同期実行を決定した場合、アプリケーションをブロックする原因になることがあります。
この説明 http://www.interact-sw.co.uk/iangblog/2010/11/01/csharp5-async-exceptions このマジックは、コンパイラがどのような手順で実現するのかを説明しています。
関連
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] C#で同期メソッドから非同期メソッドを呼び出すには?
-
[解決済み] 非同期Task<T>メソッドを同期的に実行するにはどうしたらいいですか?
-
[解決済み] ロックステートメントのボディ内で 'await' 演算子を使用できないのはなぜですか?
-
[解決済み] C#でawaitを使わずに非同期メソッドを安全に呼び出す方法
-
[解決済み】C#で例外をキャッチして再スローする理由とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない