C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■93849 / 1階層)  非同期処理の考え方
□投稿者/ WebSurfer (2022回)-(2020/02/12(Wed) 09:38:39)
No93848 (ダージリン さん) に返信

> 例外処理なだけに、awaitで待つわけにもいかず、
> こういう場合は、昔通りの書き方しかないんでしょうか?

質問者さんの言う「例外」がどういうものによるかですが、それが予測できない
もしくは予測はできても何の対応もできない例外(例えば DB サーバーダウン)
が発生した場合は、ユーザーがそのまま作業を続けて事態を悪化させないために
も、例外をランタイムに拾わせてアプリケーションを停止させるべきです。

ユーザーへの通知が必要なら集約的例外処置という手段を取るべきと思います。
具体的には以下の記事を見てください。

デリゲートを利用した非同期メソッドの実装
http://surferonwww.info/BlogEngine/post/2019/06/19/coding-asynchronous-method-by-using-delegate-in-windows-forms-application.aspx


例外処理に関する詳しい話は以下の記事に書いてありますので一読されることを
お勧めします。

NETの例外処理 Part.1
https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/

.NETの例外処理 Part.2
https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/

記事の内容を簡単にまとめると:

(1) 予測可能で正しい業務フローに戻すことができる「業務エラー」(例:ユー
  ザーの入力間違い)と、予測できないもしくは予測はできても何の対応も
  できない「例外」(例:DB サーバーダウン)を区別して対処。

(2) 「例外」はランタイムに拾わせてアプリケーションを停止させる。

(3) よほどのことがない限り try-catch は書かない。

(4) キャッチせざるを得ない場合でも Execption はキャッチしない。(範囲を
  絞る。例えば DB 関係の例外で予測される SqlException に限定して catch
  するとか)

(5) 間違って補足してしまった例外は throw する。例えば SqlException に含
  まれる PK 制約違反だけは「業務エラー」として処置したいが、その他が原因
  で発生した SqlException を catch してしまった場合。(注:catch ブロック
  でキャッチした例外を throw するとスタックトレースが途切れるので単に
  throw と書く)

(6) ユーザーへの通知が必要なら集約的例外処置を利用する。

あと、.NET 4 からは破損状態例外は catch できなくなっているそうですが、「それ
でも Catch (Exception e) を使用するのはよくない」ということについては以下の
記事を見てください。

破損状態例外を処理する
https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2009/february/clr-inside-out-handling-corrupted-state-exceptions

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←非同期処理の考え方 /ダージリン 返信無し
 
上記関連ツリー

非同期処理の考え方 / ダージリン (20/02/12(Wed) 09:25) #93848
Re[1]: 非同期処理の考え方 / Hongliang (20/02/12(Wed) 09:41) #93850
非同期処理の考え方 / WebSurfer (20/02/12(Wed) 09:38) #93849 ←Now
Re[1]: 非同期処理の考え方 / WebSurfer (20/02/12(Wed) 10:08) #93853
  └ Re[2]: 非同期処理の考え方 / ダージリン (20/02/12(Wed) 10:23) #93854
    └ Re[3]: 非同期処理の考え方 / ダージリン (20/02/12(Wed) 10:24) #93855
      └ Re[4]: 非同期処理の考え方 / ダージリン (20/02/12(Wed) 10:28) #93856
        ├ Re[5]: 非同期処理の考え方 / Hongliang (20/02/12(Wed) 10:45) #93858
        └ Re[5]: 非同期処理の考え方 / WebSurfer (20/02/12(Wed) 10:44) #93857
          └ Re[6]: 非同期処理の考え方 / ダージリン (20/02/12(Wed) 10:53) #93859 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信