D語言例外處理


異常出了問題的程式的執行期間產生了。一個D程式異常是特殊情況一個程式執行時所產生,如試圖除以零的響應。

異常提供了一種從程式的一部分控制權轉移到另一個。 D程式例外處理是建立在三個關鍵詞: try, catch, 及throw.

  • throw: 一個程式丟擲異常時,問題出現了。這是通過使用一個throw關鍵字。

  • catch: 一種程式,在要處理該問題的計劃中的地位例外處理程式捕獲異常。catch關鍵字表示異常捕獲。

  • try: try塊標識程式碼塊的哪些特定的異常將被啟用。它後跟一個或多個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
}

可以列出下多個catch語句來捕獲不同型別的異常的情況下,try塊在不同情況提出了多個異常。

引發異常:

異常可以在任何地方使用丟擲在throw語句的程式碼塊中。在throw語句的運算元確定一個型別的異常,可以是任何表示式,表示式的結果的型別決定丟擲的異常的型別。

以下是零條件除法發生丟擲異常的一個例子:

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

捕獲異常:

try塊中的catch塊下面的捕獲的任何異常。可以指定想要什麼型別的異常捕捉,這是由以下關鍵字捕捉出現在括號中的異常宣告確定的。

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

上面的程式碼將捕獲一個異常的ExceptionName型別。如果您要指定一個catch塊應該處理任何型別的被扔在一個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