2013-08-11 27 views
6

Catch(Exception)Catch(Exception ex)の違いは何ですか?私は両方が私に期待される出力を与えるのを見ることができます。次に、実際の違いは何ですか?どれがお勧めですか?キャッチ(例外)とキャッチ(例外ex)の違い

以下のコードがあるとします。

int a = 1, b = 0; 
try 
{ 
    int c = a/b; 
    Console.WriteLine(c); 
} 

使用することをお勧めします。それらの実際の違いは何ですか?

catch (Exception ex) 
{ 
    Console.WriteLine(ex.Message); 
} 

OR

catch (Exception) 
{ 
    Console.WriteLine("Oh NO!!"); 
} 
+0

:Exceptionクラス のパターンは次のようなものです");} – Steve

+1

違いは、あなたのプログラムが第1のスニペットで正しく動作しなくなる理由を*いくつか考えていることです。 2番目のスニペットには何もありません。 2番目の方法は、SOユーザーが「うまくいかない、エラーがありました」のような質問をする方法です。このようなコードを書かないでください。 –

+1

@Steve 'catch'と' catch(Exception) 'の間には小さな違いがあります。最初のものはすべての例外オブジェクトを捕捉し、2番目の例外オブジェクトは 'Exception'から派生した例外オブジェクトのみを捕捉します。 C#では、Exceptionから派生したオブジェクトしか投げることができませんが、CLRはより多くをサポートしています。 – user1908061

答えて

3

まあ、catch(Exception ex)は、唯一の違い とcatch(Exception)としてだけで同じです:catch(Exception ex)に我々は例外クラス(エラー原因) インスタンスへのアクセスを持っています。あなたは、例えば例外クラスのインスタンスを必要としない場合

try { 
    ... 
    } 
    catch (AppServerException e) { 
    Console.WriteLine("Application server failed to get data with the message:"); 
    Console.WriteLine(e.Message); // <- What's actually got wrong with it 
    } 

:通常、あなたは、元の のメッセージをプリントアウトする例外クラスのインスタンスが必要あなたが 例外を消費するだけの予定で、キャッチ(例外の例)構文が過剰であるとキャッチ(例外)prefferable です:最後に

try { 
    c = a/b; 
    } 
    catch (DivideByZeroException) { 
    c = Int.MaxValue; // <- in case b = 0, let c be the maximum possible int 
    } 

は再throughingせずに、一般的な例外クラスをキャッチしないでください:

try { 
    int c = a/b; 
    } 
    catch (Exception) { // <- Never ever do this! 
    Console.WriteLine("Oh NO!!"); 
    } 

は、あなたが本当にオーノー「と続ける 『』 がちょうどプリントアウト起こっていたものは何でもエラー(CPUから緑ヒュームが含まれている)、」コーディングしたいですか?あなたは、単に `キャッチ{Console.WriteLineを(「オーノーを書くことができますが、どのような例外に興味を持っていない場合は(スタック、メッセージなどの情報)をキャッチしている

tran.Start(); 

    try { 
    ... 
    tran.Commit(); 
    } 
    catch (Exception) { 
    // Whatever had happened, let's first rollback the database transaction 
    tran.Rollback(); 

    Console.WriteLine("Oh NO!"); 

    throw; // <- re-throw the exception 
    } 
+1

私は '_再投げずに一般的な例外クラスをキャッチしない'と同意します。そして、あなたは本当に "どんなエラー"でも "Oh No"を印刷して続行したいのですか? " 1。時には私は2をします。私がしたいかもしれない他のことがあります(ロギング以外に)。コード中でException exをキャッチするのが一般的です。 – mayu

+0

'DivideByZeroException'は' ZeroDivisonException' afaikではありません。 – mayu

3

それは非常に簡単です:最初のコードで

  • あなたは詳細な情報を持つことができるので、あなたは例外をキャッチし、それを表すオブジェクトを取得することができます何が起こったのか
  • 2番目のコードでは、例外が発生していますが、それについてのより多くの情報。

実際に使用するものは、発生した例外に関する情報の量によって異なります。

2

catchブロック内で例外を使用する必要がある場合は、Exceptionに名前を付けます。それ以外の場合は、匿名で保管してください。

catchブロックが例外のメッセージを表示するだけではならない状況があります。たとえば、アプリケーション固有の例外をキャッチすると、例外オブジェクトの追加要素を調べることができます。ここでは仮想的な例である:

catch (ConnectToServerException cse) { 
    MessageBox.Show(string.Format(
     "Connection to server '{0}' failed. Use a name from the following list: {1}" 
    , cse.AttemptedConnectionServerName 
    , string.Join(", ", cse.AllowedServerNames) 
    )); 
} 

上記のコードは、カスタム例外ConnectToServerExceptionが利用できるの名前を使用すると、接続しようとしたために、サーバーの名前でAttemptedConnectionServerNameというプロパティ、および列挙プロパティAllowedServerNamesを持っていることを前提としていサーバー。

特定のタイプの例外が発生したばかりのことを知る必要がある場合もあります。この場合、名前付き変数を指定する必要はありません。

0

Catch (Exception)同じことを、Exceptionタイプと同じように行います。

Catch (Exception ex)はすべての例外をキャッチし、さらにその参照によってメッセージを取得できます。

使用する施設があるという例外メッセージを表示する場合は、使用する必要があります。ex.Message以外の場合はCatch (Exception)で十分です。

(それだけ catchと同じになるので、この場合は、発生した例外)あなただけあなたがそのcatchブロック内つもりハンドルいる例外の種類を指定 catch(Exception)
0

catch(Exception ex)付きます発生した実際の例外のインスタンスを渡すので、例外のプロパティにアクセスして、提供された情報で何かを行うことができます。

0

違いは、1つが印刷されることです。0で除算しようとしました。ともう1つはです。

のような何か:

一般的には、特定の例外のハンドラを提供するのが最善です話す


:例外の処理

は複雑な問題であり、アプリケーションに依存しますが、ここではいくつかの一般的なコメントをしています

catch ({System.DivideByZeroException ex) 
{ 
    Console.WriteLine("Ops. I cannot divide by zero."); 
} 
catch ({System.Exception ex) 
{ 
    Console.WriteLine("There was an error during calculations: {0}", ex.Message); 
} 

遅かれ早かれ帽子Console.WriteLineは十分ではありません。ロガーを早めに使用するにはロガーを使用する必要があります。


ユーザーに、生のエラーメッセージを公開することにした場合、理想的には、例外チェーンまたは最も深いある少なくとも一つですべてのメッセージを印刷する必要があります。

のような何か:

catch ({System.DivideByZeroException ex) 
{ 
    Console.WriteLine("Oops. I cannot divide by zero."); 
} 
catch ({System.Exception ex) 
{ 
    Console.WriteLine(GetExceptionMsgs(ex)); 
} 

...in another class... 
public static string GetExceptionMsgs(Exception ex) { 
    if(ex == null) { 
     return "No exception = no details"; 
    } 
    var sb = new StringBuilder(); 
    while(ex != null) { 
     sb.AppendLine(ex.Message); 
     ex = ex.InnerException; 
    } 
    return sb.ToString() 
}