24

Usingステートメントは、作成中のオブジェクトを破棄することを知っています。次のようなことをしたい場合のように:

    Using(SqlConnection conn = new SqlConnection(connString))
    {
      //some code
      //How to show the users if conn is not opened up or generated some kind of error?
    }

connが開かれていないか、何らかのエラーが発生したかどうかをユーザーに表示する方法は?

4

9 に答える 9

25

usingブロック内に記述されたコードについて特別なことは何もありません-try.catch例外を処理するために a を使用するだけです:

using(SqlConnection conn = new SqlConnection(connString))
{
    try
    {
        conn.Open();
        // do more stuff here......

    }
    catch(SqlException sqlEx)
    {
       // log error and possibly show to user in a MessageBox or something else
    }
}

using(...) { ... }ブロック自体は、「カプセル化」されたリソース/オブジェクトが不要になったときに適切に破棄されるようにするためだけに設計されていますusingエラーを処理するためにステートメント自体でできることは何もありません。

したがって、オブジェクトの作成だけで失敗する可能性があると予想される場合は、ブロック全体をusingblock 内に配置するtry ... catchか、ブロックにフォールバックしてtry ... catch ... finally適切な破棄を自分で行う必要があります (Adam が回答で提案したように)。

于 2012-04-17T15:00:16.877 に答える
11

usingへのバックドアはありませんcatch

手動で展開するだけです(IMOを使用してtry/catchを使用しても意味がありません):

SqlConnection conn = null;

try
{
    conn = new SqlConnection("");
}
catch ...
{

}
finally
{
    if (conn != null)
        conn.Dispose();
}

コードが一度コンパイルされると入れ子になってしまうことを避けるために、ほとんどの場合、usingを a にラップしtry-catchたり、 a を埋め込んだりするよりも、これを好みます。ただし、内の大きなコードの非常に小さなサブセットのみをカバーする必要がある場合は、より詳細に埋め込みます。try-catchusingtry-catchusing

于 2012-04-17T14:59:59.853 に答える
8
class SqlConnection
{
   using(sqlConnection)
   {

   }
}

class Consumer
{
   try
  {

  }
  catch(SqlException)
  {

  }

}

例外をどう処理するかを決定するのは、クラスの消費者次第です。

于 2012-04-17T15:07:06.343 に答える
6

他の回答が述べているように、通常の try/catch を追加するだけです。

ただし、特に目標が「ユーザーにメッセージを表示する」ことである場合は、try/catch を配置する場所が間違っていることを付け加えておきます。このレベルで例外が発生するようにし、スタックをバブルアップして、応答方法を知るためのより適切な位置にあるコードに到達できるようにします。

つまり、コード サンプルをそのままにしておいてください。新しいものを追加しないでください...そのメソッドに。しかし、おそらく、このメソッドを呼び出すコードは、例外を処理する方法を考えている必要があります...データベースからの例外.

于 2012-04-17T15:09:19.800 に答える
3

通常の方法で:

また

try
{
    using(SqlConnection conn = new SqlConnection(connString)) 
    { 
      //some code        
    } 
}
catch (Exception exc)
{
    //handle error
}

また

using(SqlConnection conn = new SqlConnection(connString)) 
{ 
    try
    {
        //some code 
    }
    catch (Exception exc)
    {
        //handle error
    }                
} 
于 2012-04-17T15:00:58.633 に答える
2

それは、あなたがそれなしでそれを行うのとまったく同じ方法です.

using(SqlConnection conn = new SqlConnection(connString))
{
  try{
    //some code
  }
  catch(SqlException e)
    MessageBox.Show(e.Message);
}
于 2012-04-17T15:00:30.827 に答える
0

You don't do it inside the using

try
{
    using(SqlConnection conn = new SqlConnection(connString))
    {
        // Some code for when "conn" is succesfully instantiated
    }
}
catch (SomeSpecificConnectionInstantiationException ex)
{
    // Use ex to handle a bizarre instantiation exception?
}       
于 2012-04-17T15:02:24.510 に答える
-3

using ブロック内のコードによってスローされた例外をキャッチする場合は、using ステートメント内で try{}catch(){} を使用することをお勧めします。次に、次の 2 つの例を考えてみましょう。これは、using ステートメント内の try-catch ブロックが優れた方法である理由を説明しています。

例 1

       try{
           using(SomeObject so = new SomeObject){
              // Perform some tasks
           }
       }catch(SomeException objSomeException){
             // Perform some actions, if exception occurs
       }

例 2

       using(SomeObject so = new SomeObject){
           try{    
               // Perform some tasks
              }catch(SomeException objSomeException){
                   // Perform some actions, if exception occurs
              }
       }

ここで、using ステートメント内でいくつかのタスクを実行中に例外が発生した場合、両方の例で同じ結果が得られます。簡単な答えはノーです。

例 1 で例外が発生すると、using ブロックの最後に到達することなく、catch ブロックによってキャッチされます。したがって、例 1 の someObject は適切に破棄されません。CLR が寛大であっても (これは当てにすべきではありません)、例 1 の someObject によって使用されたメモリは回復されません (または、第 2 世代の GC コレクションで最大になります)。

例 2 の場合、catch ブロックは using ステートメント内にあります。これは、実行が using ブロックの最後に到達することを意味します。したがって、オブジェクトは破棄され、メモリ リーク (破損、

于 2012-12-27T06:50:41.560 に答える