複数 - c# 例外処理 設計




try/catch+を使う、正しい構文を使う (5)

Using()ブロックで初期化しているオブジェクトが例外をスローした場合は、2番目の構文を使用する必要があります。

私のシナリオでは、ファイルを開く必要があり、私はUsing()ブロックで初期化していたオブジェクトのコンストラクタにfilePathを渡していましたが、filePathが間違っていれば例外がスローされる可能性があります。 この場合、2番目の構文が意味を成します。

私のサンプルコード: -

try
{
    using (var obj= new MyClass("fileName.extension"))
    {

    }
}
catch(Exception ex)
{
     //Take actions according to the exception.
}

どれ:

using (var myObject = new MyClass())
{
   try
   {
      // something here...
   }
   catch(Exception ex)
   {
      // Handle exception
   }
}

または

try
{
   using (var myObject = new MyClass())
   {
      // something here...
   }
}
catch(Exception ex)
{
   // Handle exception
}

catchステートメントがusingステートメントで宣言された変数にアクセスする必要がある場合は、insideが唯一のオプションです。

catchステートメントが、使用前に参照されているオブジェクトを処理する前にオブジェクトを必要とする場合は、insideメソッドのみが使用できます。

catchステートメントがユーザーにメッセージを表示するなどの不明な期間のアクションを実行し、その前にリソースを破棄したい場合は、外部が最適です。

私がこれに似た風景を持っているときはいつも、try-catchブロックは、呼び出しスタックを使ってから別の方法になっています。 メソッド内で発生する例外をこのように処理する方法を知る方法は一般的ではありません。

だから、私の一般的な勧告は外側の外側にある。

private void saveButton_Click(object sender, EventArgs args)
{
    try
    {
        SaveFile(myFile); // The using statement will appear somewhere in here.
    }
    catch (IOException ex)
    {
        MessageBox.Show(ex.Message);
    }
}

どちらも有効な構文です。 それは本当にあなたがしたいことになります。オブジェクトの作成/廃棄に関するエラーをキャッチする場合は、2番目のオブジェクトを使用します。 そうでない場合は、最初の文字を使用します。


場合によります。 Windows Communication Foundation(WCF)をusing(...) { try... }ている場合、プロキシをusingusingいるプロキシが例外状態にある場合、 using(...) { try... }すると正しく動作しません。つまり、このプロキシを破棄すると別の例外が発生します。

個人的には、最小限の処理アプローチ、つまり実行時に認識している例外のみを処理すると考えています。 言い換えると、 using変数の初期化が特定の例外をスローする可能性があることがわかっている場合、 try-catchラップします。 同様に、 usingの変数に直接関係のない何かが起こる可能性がある場合は、その特定の例外に対して別のtryでラップします。 私はめったにExceptionを使用していません。

しかし、私はIDisposableようにusingいるので、私は偏っている可能性があります。


私は2番目を好む。 また、オブジェクトの作成に関連するエラーをトラップすることもできます。





using-statement