3

VS2012 for Desktop を使用して C# コードのエラーをデバッグおよび処理する方法を学習しようとしています。ステップ イン F11手法を使用して、以下のコードをステップ実行しています。

コードの実行がコードのさまざまな部分間をジャンプする方法を理解しています。どのステップが実行されているかを特定するのに役立つメッセージがコンソールに出力されています。画面を分割して、ステップしているコード行とコンソールの出力メッセージを同時に確認できるようにしました。

70 行目 (コメントでマークされています) -nested indexが に渡されるとき、キーワードthrowException()がある理由とその機能がわかりません。ポインターがネストされたfinallythrowブロックにジャンプするのはなぜですか?その後、メインに戻って例外をスローします。どういう意味ですか?コード内で実行がジャンプする場所はわかりますが、なぜそれが単に. 例外が既に処理されているということですか? しかし、どのように?IndexOutOfBoundsthrow

throw例外の場合、キーワードbreak;に一致すると switch ステートメントが壊れるため、ステートメントを追加する必要がないことを読みましたthrowが、これがこの例での正しい考え方かどうかはわかりません。

throw70行目のキーワードの意味を教えてください。

前もって感謝します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ch07Ex02
{
   class Program
   {
      static string[] eTypes = { "none", "simple", "index", "nested index" };

      static void Main(string[] args)
      {
         foreach (string eType in eTypes)
         {
            try
            {
               Console.WriteLine("Main() try block reached.");        // Line 19
               Console.WriteLine("ThrowException(\"{0}\") called.", eType);
               ThrowException(eType);
               Console.WriteLine("Main() try block continues.");      // Line 22
            }
            catch (System.IndexOutOfRangeException e)                 // Line 24
            {
               Console.WriteLine("Main() System.IndexOutOfRangeException catch"
                                 + " block reached. Message:\n\"{0}\"",
                                 e.Message);
            }
            catch                                                     // Line 30
            {
               Console.WriteLine("Main() general catch block reached.");
            }
            finally
            {
               Console.WriteLine("Main() finally block reached.");
            }
            Console.WriteLine();
         }
         Console.ReadKey();
      }

      static void ThrowException(string exceptionType)
      {
         Console.WriteLine("ThrowException(\"{0}\") reached.", exceptionType);
         switch (exceptionType)
         {
            case "none":
               Console.WriteLine("Not throwing an exception.");
               break;                                               // Line 50
            case "simple":
               Console.WriteLine("Throwing System.Exception.");
               throw new System.Exception();                        // Line 53
            case "index":
               Console.WriteLine("Throwing System.IndexOutOfRangeException.");
               eTypes[4] = "error";                                 // Line 56
               break;
            case "nested index":
               try                                                  // Line 59
               {
                  Console.WriteLine("ThrowException(\"nested index\") " +
                                    "try block reached.");
                  Console.WriteLine("ThrowException(\"index\") called.");
                  ThrowException("index");                          // Line 64
               }
               catch                                                // Line 66
               {
                  Console.WriteLine("ThrowException(\"nested index\") general"
                                    + " catch block reached.");
                  throw;                                            // Line 70 
               }
               finally
               {
                  Console.WriteLine("ThrowException(\"nested index\") finally"
                                    + " block reached.");
               }
               break;
         }
      }
   }
}

上記のコードは、エラーなしでコンパイルおよび実行されます。

4

4 に答える 4

1

問題のスローは、スタック トレースやその他の情報が保持されるように、例外を再スローします。

スタックの詳細を保持するためにRethrowを見てください

また、try-catch から (C# リファレンス)

パラメーターなしの catch 句によって現在処理されている例外を再スローする場合は、引数なしで throw ステートメントを使用します。

catch
{
    throw;
}
于 2013-10-07T13:23:56.810 に答える
1

throw キーワードは、正しいスタック トレースを失うことなく、キャッチされた例外を再スローするために使用されます。例外がキャッチされたときに何らかの実行を行うために使用されます(たとえば、例のようにロギングします)。

これを参照してください: SO 例外の再スローに関する質問 とこれ:コーディングホラーのブログ投稿(コメントの説明に注意してください)

于 2013-10-07T13:28:11.440 に答える