D 程式設計 - 異常處理



異常是在程式執行過程中出現的錯誤。D 異常是對程式執行期間出現的異常情況的響應,例如嘗試除以零。

異常提供了一種將控制從程式的一部分轉移到另一部分的方法。D 異常處理基於三個關鍵字:trycatchthrow

  • throw − 當出現問題時,程式丟擲一個異常。這是使用 throw 關鍵字完成的。

  • catch − 程式使用異常處理器在程式中要處理問題的地方捕獲異常。catch 關鍵字指示捕獲異常。

  • trytry 塊標識一個程式碼塊,為此啟用特定的異常。它後面跟著一個或多個 catch 塊。

假設一個塊會引發異常,一個方法使用 trycatch 關鍵字的組合來捕獲異常。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 型別的異常。如果您想指定一個 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
廣告