7

MSDN サイトでこのコードを見つけましたhttp://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open.aspx :

private static void OpenSqlConnection(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        Console.WriteLine("ServerVersion: {0}", connection.ServerVersion);
        Console.WriteLine("State: {0}", connection.State);
    }
}

私の質問は... サイトでは.Open()InvalidOperationExceptions と SqlExceptions をスローできることにも注意していますが、この例ではそれらを処理しているようには見えません。

これは、彼らがコードを簡単に説明したからでしょうか、それともここで扱う価値がない理由があるのでしょうか? それらは何らかの方法で using コンストラクトによって処理される可能性がありますか?

4

7 に答える 7

9

これは、彼らがコードを簡単に説明したからでしょうか、それともここで扱う価値がない理由があるのでしょうか? それらは何らかの方法で using コンストラクトによって処理される可能性がありますか?

usingキーワードはシンタックス シュガーであり、try/finally参照したコードで発生する可能性のある例外は処理されませんが、SQL 接続は適切に破棄されます。多くの人が例外を最上位層にバブルアップさせ、そこで例外を処理することを好むため、可能性のある例外を明示的に処理していない可能性があります。

于 2012-04-30T14:22:00.987 に答える
4

MSDN の例は、ベスト プラクティスを教えるためではなく、読みやすい例を提供するために書かれています。これが、コードを理解せずにコードをコピー/ペーストしてはならない理由の 1 つです。

MSDN ごと

using ステートメントは、オブジェクトの Dispose メソッドを正しい方法で呼び出します。また、(前に示したように使用すると)、Dispose が呼び出されるとすぐに、オブジェクト自体がスコープ外になります。

(finally を使用して) 開いている接続を閉じます。スローされた例外をキャッチしません。これは、同封のステートメントを try/finally でラップすることによって行われます。キャッチはありません。

于 2012-04-30T14:20:52.893 に答える
3

これらの例外をトラップする際に「できる」ことがあるかどうかによって異なります。

そうでない場合 - 一般的に考えられるベスト プラクティスは、意味のある方法で例外を処理できるようになるまで、例外をスタックにバブル アップさせることです (Web アプリの場合は 500 エラーをログに記録するだけかもしれません)。

于 2012-04-30T14:20:43.203 に答える
2

これらのケースは処理されています。

ステートメントは、using例外が発生した場合の破棄も処理する適切な破棄パターンに変換されます。

この場合、例外がスローされても、接続は破棄されます。

例外自体がバブルアップします。

詳細については、MSDN のusing Statementを参照してください。

于 2012-04-30T14:21:09.600 に答える
1
using (SqlConnection connection = new SqlConnection(connectionString))
    {

    }

と同等です

try
{

    SqlConnection connection = new SqlConnection(connectionString)
}
finally
{
   connection.Dispose();
}

「使用」とは、オブジェクトの dispose() メソッドが確実に呼び出されるようにすることです (この場合、接続が接続プールに確実に返されるようにするため)。「使用する」は、キャッチを置き換えることを意図したものではありません。

私が取り組んできたプロジェクトでは、通常、最終的に多くの試行が行われます。Catch は、それをログに記録するために最高レベルでのみ使用されます。エラーを再スローするために catch を使用すべきでない理由の 1 つは、catch が非常にリソースを集中的に使用することです。

于 2012-04-30T14:34:57.920 に答える
0

using ステートメントにより、オブジェクトのメソッドを呼び出しているときに例外が発生した場合でも Dispose が呼び出されることが保証されます。Try/catch は高価です。try/catch は、コンパイラーの最適化に影響を与える可能性があり、プログラマーが null のチェックと同じくらい簡単なことを行うよりも try/catch を使用する場合があります。それはただの悪い習慣です。例外のキャッチは、単純なチェックを行うよりも常に遅くなります。それらを使用するとは言っていませんが、防御的プログラミングの代わりに使用しないでください。

また、コードを見ると、「open」コマンドは有効な接続がある場合にのみ呼び出されます..心配する必要はありません....

「使用する」ことは、オブジェクトを try ブロック内に配置してから、finally ブロックで Dispose を呼び出すことと同じです。

特定の例外を処理する必要がある場合は、try..catch..

于 2012-04-30T14:29:39.900 に答える
0

このサンプルは紛らわしいですが、技術的には正しいものです。実際のアプリケーションでは、このサンプルは「そのまま」では価値がありません。
SqlConnection を呼び出し元のコードに返すことすらありません。
あなたが言ったように、「彼らはコードを簡単に説明していました」。

現実世界のシナリオでは、このような方法を持つことができます

private static SqlConnection OpenSqlConnection(string connectionString) 
{ 
    SqlConnection connection = new SqlConnection(connectionString)
    connection.Open(); 
    return connection;    
} 

そしてそれをコードで使用します(得るものはあまりありませんが)

using(SqlConnection cnn = OpenSqlConnection(connectionString))
{
    // Do your work here
    ....
}

もちろん、using ステートメントはすべての作業を隠して例外をキャッチし、すべてを閉じたり破棄したりするため、技術的に言えば例外は処理されますが、実際には何かが失敗した場合の手がかりは得られません。

于 2012-04-30T14:33:51.977 に答える