7

私はそこにコードを持っています

//Code 1                        Code 2                          Code 3
try                             try                             try
{                               {                               {
    //Exp occur                     //Exp occur                     //Exp occur 
}                               }                               }
catch (Exception e)             catch (Exception)               catch
{                               {                               {
    //Handle exp                    //Handle exp                    //Handle exp
}                               }                               }

3つのコードすべての違いは何
ですか 私は初めてで、この構文に関するC#限りJavaObjective-Cエラーがスローされます

4

7 に答える 7

10

コード 1

e後で例外処理に使用できるオブジェクトで例外をキャッチします。たとえば、 Message プロパティをログに記録しe.Messageたり、 またはを使用してスタック トレースを表示したりできます。e.StackTrace

コード 2

基本型のすべての例外をキャッチしていExceptionますが、それに関連するオブジェクトがないため、その例外をスローしてバブルアップするか、例外を無視することしかできません。そのコードであなたが持っていた場合:

catch(InvalidCastException)

次に、例外オブジェクトなしInvalidCastExceptionですべてがブロックで処理されます

コード 3

タイプに関係なく、すべてのタイプの例外をキャッチしています。これは、基本クラスのコード 2 に似ています。Exception

トライキャッチ - MSDN

引数なしで catch 句を使用して、任意のタイプの例外をキャッチできますが、この使用法はお勧めしません。一般に、回復方法がわかっている例外のみをキャッチする必要があります。

基本例外をキャッチする前に特定の例外をキャッチすると、常により良い結果が得られます。何かのようなもの。

try
{
}
catch(InvalidCastException ex)
{
}
catch(Exception ex)
{
}

試してみてください - キャッチ - MSDN

同じ try-catch ステートメントで複数の特定の catch 句を使用することができます。この場合、catch 節は順番に検査されるため、catch 節の順序は重要です。より具体的な例外の前に、より具体的な例外をキャッチします。後続のブロックに到達できないように catch ブロックを並べ替えると、コンパイラはエラーを生成します。

于 2013-01-04T10:56:01.453 に答える
3

コード1-かなり普通の漁獲量、うまくいけば説明は必要ありません

コード2-特定の例外が発生したときに特定のコードを実行したいが、実際に例外オブジェクトと対話する意図はありません。ほとんどの場合throw;、最後にステートメントを付ける必要があります。そうすれば、スタックの上位にいる誰かがそれを行うことができcatchます。

コード3-任意の例外(*)に対してコードを実行する必要があります(catch同じの以前の句によってキャッチされたものを除くtry)。繰り返しになりますが、ほとんどの場合、throw;上位のコードがcatch実際に例外を処理できるように、を含める必要があります。

あるレベル(おそらく最上位レベル、現在の環境の未処理の例外ハンドラー)では、何かが例外オブジェクトを検査し、おそらくそれをログに記録する必要があります(可能な場合)。

于 2013-01-04T10:52:39.480 に答える
2

ここで、変数 'e' を使用して例外メッセージを取得する場合は、Line または type.

//Code 1                       
try                            
{                              
 //Exp occur                
}                              
catch (Exception e)            
{                              
 //Handle exp               
}

特定のタイプの例外を取得し、例外変数を処理しないための以下のコード。

//Code 2
try                            
{                              
  //Exp occur                
}                              
catch (Exception)
{                              
 //Handle exp           
}

以下のコードは、すべてのタイプの例外をキャッチします。

//Code 3
try
{
 //Exp occur    
}     
catch 
{                  
 //Handle exp   
}
于 2013-01-04T10:52:55.897 に答える
1

例外オブジェクトを実際に使用する場合、そのプロパティをログファイルに記録する場合、メッセージボックスを表示する場合、または別の種類の例外をスローして現在の例外をコンストラクタに渡す場合は、3つのうち最初のオブジェクトを使用する必要があります(最も残っているもの)。

一般に、最もよく使用されるアプローチはとにかく最初のアプローチです。異なる種類の例外を個別に処理する場合は、最も特殊なものから始めて複数のキャッチブロックを上に置き、下に書いたものを置いて、すべての例外がまだ発生しないようにすることができます。処理は汎用catchブロックで終了します。

于 2013-01-04T10:50:42.173 に答える
1

何もない。それらはすべて、発生する可能性のあるすべての例外をキャッチします(基本タイプExceptionまたはいずれかをキャッチすることによって)。これは通常、正当な理由で眉をひそめます。特定の例外を予期した順序でキャッチする必要があります。すべての例外をキャッチする場合はException、最後にキャッチします。

try
{
}
catch (MyCustomException)
{
    // do something for your custom exception
}
catch (Exception)
{
    // do something for everything else
}

例外に変数を指定すると、メッセージ全体を介して、または単にメッセージ全体に対してcatch (Exception e)、スタックトレース(およびその他の例外情報)にアクセスできるようになります。また、キャッチされたときの例外に対するベストプラクティスです(このレベルで例外を抑制し、呼び出し元のコードに例外を表示させたくない場合を除きます)。そのため、例外が発生し、スタックトレースが保持されます。e.Propertye.ToString()throw

catch (Exception e)
{
    // do something with e

    throw;
}
于 2013-01-04T10:50:49.543 に答える
1

コード 1 はすべての例外を (あなたのケースでは!) キャッチして宣言するので、後でエラー メッセージなどに使用できます。

MessageBox.Show(e.Message);

コード 2 もすべての例外をキャッチします (あなたの場合です!) が、宣言されていないため使用できません。

これら 2 つのメソッドは、そのために設計されたものではなく、特定の例外またはカスタム例外をキャッチするように設計されています。

    try
    {
     //mycode
    }catch(MyException myExc)
    {   
    //TODO HERE  
    Console.Write(myExc.Message);  
    }

3 番目のものは、すべての例外をキャッチします。定義がないからです。

見てみましょう: http://msdn.microsoft.com/de-de/library/0yd65esw%28v=vs.80%29.aspx

C# の例外の詳細については、こちらをご覧ください。

于 2013-01-04T10:56:49.020 に答える
1

違い:

  1. 例外パラメーター ex を宣言すると、例外オブジェクトにアクセスして、そのプロパティ、フィールド、メソッドなどを表示および操作できます。この "ex" 変数は、任意のメソッドの任意のパラメーターと同じように機能します。

  2. パラメータ ex なしで例外タイプを宣言すると、さまざまなタイプの例外に対して複数の「キャッチ」領域を分離できます。これは役に立たず、ここで定義するコード サンプル 3と機能的に同等ですが、例外の種類に応じて異なるアクションを実行する必要があり、例外オブジェクトにアクセスする必要がない場合 (例外のタイプ)、これがあなたのやり方です。

  3. 型指定されていない Catch Exception Handlerを使用すると、タイプに関係なく、スローされる可能性のある例外のフォールバックを追加できます。ただし、パラメーター化されていないため、Exception オブジェクトのプロパティやメソッドにアクセスすることはできません。したがって、コードサンプル 2コード サンプル 3はどちらも同等です。

例:

try{ // code that throws exception }
catch(TypeException ex) 
{ 
    // code to handle exceptions of type TypeException
    // I can access ex parameter, for example to show its Message property
    MessageBox.Show(ex.Message);
}
catch(OtherTypeException) 
{ 
    // code to handle exceptions of type OtherTypeException 
    // I cannot access the ex parameter since it is not declared, but I know
    // the exact type of the exception
    MessageBox.Show("There was an exception of Other Type");
}
catch
{
    // code to handle any other exception
    // this is functionally equivalent to catch(Exception) since all typed exceptions
    // inherit from the base type Exception
    MessageBox.Show("An unknown exception has been thrown.");
}
...
于 2013-01-04T11:18:19.777 に答える