D-programming-exception-handling

提供:Dev Guides
移動先:案内検索

Dプログラミング-例外処理

例外は、プログラムの実行中に発生する問題です。 D例外は、ゼロ除算の試行など、プログラムの実行中に発生する例外的な状況への応答です。

例外は、プログラムのある部分から別の部分に制御を移す方法を提供します。 D例外処理は、3つのキーワード trycatch 、および throw に基づいています。

  • throw -問題が発生すると、プログラムは例外をスローします。 これは、 throw キーワードを使用して行われます。
  • catch -プログラムは、問題を処理するプログラム内の場所で例外ハンドラーを使用して例外をキャッチします。 catch キーワードは、例外のキャッチを示します。
  • try - try ブロックは、特定の例外がアクティブになるコードのブロックを識別します。 その後に1つ以上のcatchブロックが続きます。

ブロックが例外を発生させると仮定すると、メソッドは try キーワードと catch キーワードの組み合わせを使用して例外をキャッチします。 try/catchブロックは、例外を生成する可能性のあるコードの周りに配置されます。 try/catchブロック内のコードは保護されたコードと呼ばれ、try/catchを使用するための構文は次のようになります-

try {
  //protected code
}
catch( ExceptionName e1 ) {
  //catch block
}
catch( ExceptionName e2 ) {
  //catch block
}
catch( ExceptionName eN ) {
  //catch block
}
*try* ブロックが異なる状況で複数の例外を発生させた場合に、複数の *catch* ステートメントをリストして、異なるタイプの例外をキャッチできます。

Dでの例外のスロー

*throw* ステートメントを使用して、コードブロック内のどこにでも例外をスローできます。 throwステートメントのオペランドは例外のタイプを決定し、任意の式にすることができ、式の結果のタイプはスローされる例外のタイプを決定します。

次の例では、ゼロ除算条件が発生すると例外がスローされます-

double division(int a, int b) {
   if( b == 0 ) {
      throw new Exception("Division by zero condition!");
   }

   return (a/b);
}

Dでの例外のキャッチ

*try* ブロックに続く *catch* ブロックは、例外をキャッチします。 キャッチする例外のタイプを指定できます。これは、キーワードcatchに続く括弧内に表示される例外宣言によって決まります。
try {
  //protected code
}

catch( ExceptionName e ) {
  //code to handle ExceptionName exception
}

上記のコードは、 ExceptionName タイプの例外をキャッチします。 あなたがキャッチブロックがtryブロックでスローされる例外の任意のタイプを処理するように指定したい場合は、次のように例外宣言を囲む括弧の間に、省略記号を置く必要があります-

try {
  //protected code
}

catch(...) {
  //code to handle any exception
}

次の例は、ゼロ除算例外をスローします。 catchブロックでキャッチされます。

import std.stdio;
import std.string;

string division(int a, int b) {
   string result = "";

   try {
      if( b == 0 ) {
         throw new Exception("Cannot divide by zero!");
      } else {
         result = format("%s",a/b);
      }
   } catch (Exception e) {
      result = e.msg;
   }

   return result;
}

void main () {
   int x = 50;
   int y = 0;

   writeln(division(x, y));

   y = 10;
   writeln(division(x, y));
}

上記のコードがコンパイルおよび実行されると、前のセクションで作成されたファイルを読み取り、次の結果を生成します-

Cannot divide by zero!
5