2012-04-24 9 views
3
using (SqlConnection con = new SqlConnection()) 
{ 
    try 
    { 
      con.Open(); 
    } 
    catch (Exception ex) 
    { 
      MessageBox.Show(ex.Message); 
    } 
} 

これは問題なく動作します。しかし、私は、のような例外を処理することができることを知りたいですか?if else?または使用するメンドテールですtry catchtry catchを使用せずに例外を処理するには?

+0

@Henk Holterman:この質問は本当に悪いですか、あなたはそれに投票しますか?代替案を探して悪いですか? – jams

+1

@Henk。私は同意します...誰もが理論、戦略、またはスタックのオーバーフローに関するパフォーマンスの質問をすることができるという全体的な問題があります。私はプログラマーの方ではなく、より良いところに来てくれるように尋ねる傾向があります。 – KingOfHypocrites

+0

私は、この質問では下院議決が完全に公平だとは思わない。それは完全に正当な質問です。 –

答えて

5

try catch以外の例外を処理するメカニズムはありません。

if(connection.DidAnErrorOccur) 

のように聞こえますが、それは存在しません。

3

エラーを返すすべての条件をチェックするしか方法はありません。とにかくこれをやっているはずです。試してみると高価です。キャッチを最後の手段にする必要があり、その目的のためにその周りに道がありません。

+2

リアルタイムシステムを開発していない限り(これも議論することができます)、いいえ、Try/Catchは高価ではありません。ベンチマークを実行すると、あなた自身が見えます。 – GETah

+1

try/catchを使用すると、コンパイラの最適化に影響を与える可能性があります。それはちょうど悪い習慣です。例外をキャッチすることは、単純なチェックを行うよりも遅くなります。私はそれらを使うことを言っているのではなく、防御的なプログラミングの代わりにそれらを使用しないでください。 – KingOfHypocrites

+0

右、良い点! +1、あなたはそれに値する。 – GETah

1

Tejsの答えが正しいです、私はエラーを処理するための他のメカニズムはないと信じています。

ただし、より具体的なエラーは処理できます。 try catchの外に変数を宣言して、成功したかどうかを確認することもできます。

例:

using (SqlConnection con = new SqlConnection()) 
{ 
    bool sqlErrorOccurred; 

    try 
    { 
     con.Open(); 
     sqlErrorOccurred = false; 
    } 
    catch (SqlException ex) 
    { 
      sqlErrorOccurred = true; 
    } 

    if(sqlErrorOccurred) 
    { 
     MessageBox.Show("A Sql Exception Occurred"); 
    } 
} 
+0

これはどのようにしてtry/catchを取り除きますか? – GETah

+0

あなたのメッセージボックスはcatch文の中に入ることができます。同じことをやるだけのコード。 – KingOfHypocrites

+0

私は単に概念を説明しています - これはあなたが使うコードではありません。 KingOfHypocritesが言ったように、catchステートメントにmessageboxを置くことができます。しかし、catch文に入れることができないはるかに複雑なものがあります。 – Scen

2

私はあなたを与えることができる最高の選択肢はELMAHです。 http://code.google.com/p/elmah/ すべてのキャッチされていないエラーを処理してログに記録します。そこから、エラーを修正したり、特定のエラーをキャッチしたり、発生する可能性のあるエラーをキャッチしたりすることはお勧めしません。例外が発生したため、コードをスキップするのではなく、潜在的な問題を修正できるようにするのが最善です。

0

上記の回答は正しいです。ただし、グローバル例外ハンドラを設定することも可能です。これは、前述の防御的なコーディングの必要性を解決するものではありません。ただし、すべての例外を処理する必要があると懸念がある場合(たとえば、エラーを記録するなど)、このアプローチは非常に役に立ちます。

0

私は、リアルタイムのストリーミングデータを使用するシステムを構築しているため、他のすべてがアイドル状態のときに発生する可能性のあるエラーを処理する必要があります。私が使用しているAPIは、エラーを "error"という名前のメソッドを介してプログラムに戻しますが、例外が添付されています。このメソッドは、エラーをスローする可能性がありますが、それは問題です。なぜなら、私のプログラム全体をtry-catchブロック内に置くのは良い考えではありません。

これを回避するために、プログラムのメイン部分でイベントを発生させるイベントハンドラを設定します。このイベントハンドラは、その時点でスローされたエラーを処理できます。例えば

メインクラスでは:(APIからエラーを受け取り、クラスで)

private void Error(object sender, EventArgs e) { 

    Exception ex = sender as Exception; 

    Console.WriteLine("Error: " + ex); // Or whatever you want to do with the exception 

    // You could even add this if you want to then use the try -catch sequence (which 
    // makes the exception easier to parse and also enables you to stop the program 
    // with unhandled exceptions if it's something catastrophic: 

    try { 

     throw ex; 
    } catch (put.your.exception.detail.here) { 

     // do stuff 
    } finally { 

     // do other stuff 
    } 
} 

class Foo { 
    public event EventHandler ThrowError; 

    protected virtual void OnError(Object src, EventArgs e) { 

     if (ThrowError != null) { 

      ThrowError(src, e); 
     } 
    } 

    private virtual void error(Exception e) { 

     OnError(e, EventArgs.Empty); 
    } 
} 
2

OK、あなたがデを実装することができますグローバルのApplication_Error。 asax、この方法は、エラーの最初の防衛線で、たとえば、Default.aspxのための特定のページの

http://msdn.microsoft.com/en-us/library/24395wz3%28v=vs.100%29.aspx

すべてのアプリケーションのために、あなたはのPage_Error

http://msdn.microsoft.com/en-us/library/ed577840%28v=vs.100%29.aspx

を実装することができています

あなたが望むすべてのコントローラにOnException(ExceptionContext filterContext)を実装できるように、mvcで作業している場合は、これが満たされます処理されない例外が発生すると、hodが呼び出されます。

http://devproconnections.com/aspnet-mvc/aspnet-mvc-tutorial-handling-errors-and-exceptions

か、多分あなたはこれであなたが条件

を評価することができ、 assert文を使用することができ、別の手について

https://www.simple-talk.com/dotnet/asp.net/handling-errors-effectively-in-asp.net-mvc/

atributeあなたエラーを実装することができます

http://msdn.microsoft.com/en-us/library/ttcc4x86.aspx

関連する問題