3

次の例のように、USING に対して TRY-CATCH を実装しています。

private void someDatabaseMethod(string userName) {

    try {

        using(var conn = new SqlConnection(connString))
        using(var comm = new SqlCommand()) {
            comm.Connection = conn;
            comm.CommandType = CommandType.Text;
            comm.CommandText = string.Concat(@"SELECT UserID FROM xxx WHERE UserName = '", userName,@"'");
            conn.Open();
            object x = comm.ExecuteScalar();
            UserID = (x==null)? 0: (int)x;
        }
    } catch(Exception) {
        throw;
    }
}

USING内にあるTRY-CATCHを指しているように見えるこのMSDNの例を見たところです。したがって、私の例は次のようになります。

private void someDatabaseMethod(string userName) {

        using(var conn = new SqlConnection(connString))
        using(var comm = new SqlCommand()) {
            comm.Connection = conn;
            comm.CommandType = CommandType.Text;
            comm.CommandText = string.Concat(@"SELECT UserID FROM xxx WHERE UserName = '", userName,@"'");

            try {

               conn.Open();
               object x = comm.ExecuteScalar();
               UserID = (x==null)? 0: (int)x;

            } catch(Exception) {
               throw;
            }
        }
}

これはより効率的なレイアウトですか?もしそうなら、なぜですか?


追加の注意事項

その理由はTRY-CATCH、例外を再スローして、次のレベルにバブルアップするためCATCHです。そのため、コードのどこかに a が必要です。

4

5 に答える 5

2

TRY-CATCH は、using例外をログに記録する場合、またはトランザクションがある場合にのみ使用します-例外ブロックでロールバックします。using は TRY-FINALLY でコンパイラによって変換されます。IL 逆アセンブラー (ildasm.exe) またはリフレクターでチェックして、使い捨てのリソースを解放できます。したがって、 using次と同等です。

try 
{
 //do job
} 
finally
{
  Resource.Dispose()
}
于 2013-04-11T09:16:37.360 に答える
2

2 番目の方が効率的です。最初のもの; catch ブロックから接続オブジェクトにアクセスできず、閉じることもできません。また、この接続でトランザクションを使用していた場合、エラーが発生したときにトランザクションをロールバックできませんでした...

于 2013-04-11T09:20:33.873 に答える
0
  • この場所で処理できない例外をキャッチしないでください。
  • catch{throw;} は、複雑さを追加する以外は役に立ちません
  • 例外を処理できる限り、例外ソースの近くで例外をキャッチして処理する

ここで広範な議論を読む

于 2013-04-11T09:18:15.893 に答える