C# チュートリアルlogin
C# チュートリアル
著者:php.cn  更新時間:2022-04-11 14:06:23

C# 例外処理



例外とは、プログラムの実行中に発生する問題です。 C# の例外は、ゼロで除算しようとするなど、プログラムの実行中に発生する特殊な状況に対する応答です。

例外は、プログラムの制御をある部分から別の部分に移す方法を提供します。 C# の例外処理は、trycatchfinallythrow の 4 つのキーワードに基づいています。

  • try: try ブロックは、特定の例外をトリガーするコードのブロックを識別します。 1 つ以上の catch ブロックが続きます。

  • catch: プログラムは例外ハンドラーを通じて例外をキャッチします。 catch キーワードは例外のキャッチを示します。

  • finally:finally ブロックは、例外がスローされるかどうかに関係なく、指定されたステートメントを実行するために使用されます。たとえば、ファイルを開いた場合、例外が発生したかどうかに関係なく、ファイルは閉じられます。

  • throw: 問題が発生すると、プログラムは例外をスローします。これを実現するには、throw キーワードを使用します。

構文

ブロックが例外をスローし、メソッドが try および catch キーワードを使用して例外をキャッチすると仮定します。 try/catch ブロック内のコードは保護されたコードです。次のように try/catch 構文を使用します。

try
{
   // 引起异常的语句
}
catch( ExceptionName e1 )
{
   // 错误处理代码
}
catch( ExceptionName e2 )
{
   // 错误处理代码
}
catch( ExceptionName eN )
{
   // 错误处理代码
}
finally
{
   // 要执行的语句
}

さまざまな種類の例外をキャプチャする複数の catch ステートメントをリストして、try ブロックがさまざまな状況で複数の例外を生成するのを防ぐことができます。例外。

C# の例外クラス

C# 例外はクラスによって表されます。 C# の例外クラスは、主に System.Exception クラスから直接的または間接的に派生します。 System.ApplicationException クラスと System.SystemException クラスは、System.Exception クラスから派生した例外クラスです。

System.ApplicationException クラスは、アプリケーションによって生成された例外をサポートします。したがって、プログラマが定義するすべての例外はこのクラスから派生する必要があります。

System.SystemException クラスは、すべての事前定義されたシステム例外の基本クラスです。

次の表は、Sytem.SystemException クラスから派生したいくつかの事前定義された例外クラスを示しています。

System.IndexOutOfRangeExceptionメソッドが範囲外の配列インデックスを指している場合に生成されるエラーを処理します。 System.ArrayTypeMismatchException 配列の型が一致しない場合に生成されるエラーを処理します。 System.NullReferenceException Null オブジェクトに依存するときに生成されるエラーを処理します。 System.DivideByZeroException ゼロ除算時に生成されたエラーを処理します。 System.InvalidCastException型キャスト中に生成されたエラーを処理します。 System.OutOfMemoryException空きメモリ不足によって生成されたエラーを処理します。 System.StackOverflowException は、スタック オーバーフローによって生成されたエラーを処理します。 これらのエラー処理ブロックは、trycatchfinally キーワードを使用して実装されます。ゼロで除算するときにスローされる例外の例を次に示します。
using System;
namespace ErrorHandlingApplication
{
    class DivNumbers
    {
        int result;
        DivNumbers()
        {
            result = 0;
        }
        public void division(int num1, int num2)
        {
            try
            {
                result = num1 / num2;
            }
            catch (DivideByZeroException e)
            {
                Console.WriteLine("Exception caught: {0}", e);
            }
            finally
            {
                Console.WriteLine("Result: {0}", result);
            }

        }
        static void Main(string[] args)
        {
            DivNumbers d = new DivNumbers();
            d.division(25, 0);
            Console.ReadKey();
        }
    }
}
例外処理C# は、try ブロックと catch ブロックの形式で構造化例外処理ソリューションを提供します。これらのブロックを使用して、コア プログラム ステートメントをエラー処理ステートメントから分離します。
、および
上記のコードがコンパイルされて実行されると、次の結果が生成されます:

Exception caught: System.DivideByZeroException: Attempted to divide by zero. 
at ...
Result: 0

ユーザー定義の例外の作成

独自の例外を定義することもできます。ユーザー定義の例外クラスは、

ApplicationException クラスから派生します。次の例はこれを示しています:

using System;
namespace UserDefinedException
{
   class TestTemperature
   {
      static void Main(string[] args)
      {
         Temperature temp = new Temperature();
         try
         {
            temp.showTemp();
         }
         catch(TempIsZeroException e)
         {
            Console.WriteLine("TempIsZeroException: {0}", e.Message);
         }
         Console.ReadKey();
      }
   }
}
public class TempIsZeroException: ApplicationException
{
   public TempIsZeroException(string message): base(message)
   {
   }
}
public class Temperature
{
   int temperature = 0;
   public void showTemp()
   {
      if(temperature == 0)
      {
         throw (new TempIsZeroException("Zero Temperature found"));
      }
      else
      {
         Console.WriteLine("Temperature: {0}", temperature);
      }
   }
}
上記のコードがコンパイルされて実行されると、次の結果が生成されます:
TempIsZeroException: Zero Temperature found
Throw object

例外が

System.Exception

クラスから直接または間接的に派生する場合、次のことが可能です。物を投げる。次のように catch ブロック内で throw ステートメントを使用して現在のオブジェクトをスローできます:

Catch(Exception e)
{
   ...
   Throw e
}