[解決済み] catch, when "で例外をキャッチする
質問
C#の新しい機能で、特定の条件が満たされたときにキャッチハンドラを実行することができることを知りました。
int i = 0;
try
{
throw new ArgumentNullException(nameof(i));
}
catch (ArgumentNullException e)
when (i == 1)
{
Console.WriteLine("Caught Argument Null Exception");
}
私は、これがいつ役に立つかもしれないかを理解しようとしています。
1つのシナリオは次のようなものでしょう。
try
{
DatabaseUpdate()
}
catch (SQLException e)
when (driver == "MySQL")
{
//MySQL specific error handling and wrapping up the exception
}
catch (SQLException e)
when (driver == "Oracle")
{
//Oracle specific error handling and wrapping up of exception
}
..
というように、同じハンドラ内で、ドライバのタイプに応じて異なるメソッドに委譲することができます。これでコードがわかりやすくなったでしょうか?おそらく違います。
私が考えることができる別のシナリオは、次のようなものです。
try
{
SomeOperation();
}
catch(SomeException e)
when (Condition == true)
{
//some specific error handling that this layer can handle
}
catch (Exception e) //catchall
{
throw;
}
これもまた、こんな感じで。
try
{
SomeOperation();
}
catch(SomeException e)
{
if (condition == true)
{
//some specific error handling that this layer can handle
}
else
throw;
}
catch, when' 機能を使用すると、ハンドラ内で特定のユースケースを処理する場合と比較して、ハンドラがスキップされ、スタックの巻き戻しがより早く行われるため、例外処理が速くなりますか?また、この機能により適合し、グッドプラクティスとして採用できる特定のユースケースはありますか?
どのように解決するのですか。
キャッチブロックでは既に タイプ をフィルタリングすることができます。
catch (SomeSpecificExceptionType e) {...}
は
when
節を使うと、このフィルタを一般的な式に拡張することができます。
このように
を使うと
when
節を使うことになります。
タイプ
が明確でなく、ここで例外を処理すべきかどうか判断できない場合。
一般的な使用例として、例外タイプは実際には ラッパー であり、複数の異なる種類のエラーのためのラッパーです。
私が実際に使用したケースを紹介します(VBでは、すでにかなり以前からこの機能があります)。
try
{
SomeLegacyComOperation();
}
catch (COMException e) when (e.ErrorCode == 0x1234)
{
// Handle the *specific* error I was expecting.
}
同じく
SqlException
と同じで、これも
ErrorCode
プロパティも持っています。代替案はこのようなものでしょう。
try
{
SomeLegacyComOperation();
}
catch (COMException e)
{
if (e.ErrorCode == 0x1234)
{
// Handle error
}
else
{
throw;
}
}
というのは、間違いなく、よりエレガントでなく はスタックトレースを少し崩します。 .
さらに、同じ タイプ の例外を同じtry-catch-blockの中で2回言及することができます。
try
{
SomeLegacyComOperation();
}
catch (COMException e) when (e.ErrorCode == 0x1234)
{
...
}
catch (COMException e) when (e.ErrorCode == 0x5678)
{
...
}
がなければできないことですが
when
の条件なしでは不可能です。
関連
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] C#を使用してREST APIの呼び出しを行うには?
-
[解決済み】C#で例外をキャッチして再スローする理由とは?
-
[解決済み】C++の例外を投げる方法
-
[解決済み】例外をスローしない場合、try/catchブロックはパフォーマンスを低下させるか?
-
[解決済み】WPFアプリケーションで例外をグローバルにキャッチする?
-
[解決済み】再試行キャッチはどのように実装するのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#で四捨五入する方法
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み] 投げる」と「投げる元」は違うのですか?