VS2012 for Desktop を使用して C# コードのエラーをデバッグおよび処理する方法を学習しようとしています。ステップ イン F11手法を使用して、以下のコードをステップ実行しています。
コードの実行がコードのさまざまな部分間をジャンプする方法を理解しています。どのステップが実行されているかを特定するのに役立つメッセージがコンソールに出力されています。画面を分割して、ステップしているコード行とコンソールの出力メッセージを同時に確認できるようにしました。
70 行目 (コメントでマークされています) -nested index
が に渡されるとき、キーワードthrowException()
がある理由とその機能がわかりません。ポインターがネストされたfinallythrow
ブロックにジャンプするのはなぜですか?その後、メインに戻って例外をスローします。どういう意味ですか?コード内で実行がジャンプする場所はわかりますが、なぜそれが単に. 例外が既に処理されているということですか? しかし、どのように?IndexOutOfBounds
throw
throw
例外の場合、キーワードbreak;
に一致すると switch ステートメントが壊れるため、ステートメントを追加する必要がないことを読みましたthrow
が、これがこの例での正しい考え方かどうかはわかりません。
throw
70行目のキーワードの意味を教えてください。
前もって感謝します。
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;
}
}
}
}
上記のコードは、エラーなしでコンパイルおよび実行されます。