異常出了問題的程式的執行期間產生了。一個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