異常出了問(wèn)題的程序的執(zhí)行期間產(chǎn)生了。一個(gè)D程序異常是特殊情況一個(gè)程序運(yùn)行時(shí)所產(chǎn)生,如試圖除以零的響應(yīng)。
異常提供了一種從程序的一部分控制權(quán)轉(zhuǎn)移到另一個(gè)。 D程序異常處理是建立在三個(gè)關(guān)鍵詞: try, catch, 及throw.
throw: 一個(gè)程序拋出異常時(shí),問(wèn)題出現(xiàn)了。這是通過(guò)使用一個(gè)throw關(guān)鍵字。
catch: 一種程序,在要處理該問(wèn)題的計(jì)劃中的地位異常處理程序捕獲異常。catch關(guān)鍵字表示異常捕獲。
try: try塊標(biāo)識(shí)代碼塊的哪些特定的異常將被激活。它后跟一個(gè)或多個(gè)catch塊。
假設(shè)一個(gè)塊將拋出一個(gè)異常,一個(gè)方法捕獲使用try和catch關(guān)鍵字的組合異常。try/ catch塊放在圍繞,可能產(chǎn)生異常的代碼。try / catch塊中的代碼被稱為受保護(hù)的代碼,以及語(yǔ)法使用try/ catch語(yǔ)句如下所示:
try { // protected code } catch( ExceptionName e1 ) { // catch block } catch( ExceptionName e2 ) { // catch block } catch( ExceptionName eN ) { // catch block }
可以列出下多個(gè)catch語(yǔ)句來(lái)捕獲不同類型的異常的情況下,try塊在不同情況提出了多個(gè)異常。
異??梢栽谌魏蔚胤绞褂脪伋鲈趖hrow語(yǔ)句的代碼塊中。在throw語(yǔ)句的操作數(shù)確定一個(gè)類型的異常,可以是任何表達(dá)式,表達(dá)式的結(jié)果的類型決定拋出的異常的類型。
以下是零條件除法發(fā)生拋出異常的一個(gè)例子:
double division(int a, int b) { if( b == 0 ) { throw new Exception("Division by zero condition!"); } return (a/b); }
try塊中的catch塊下面的捕獲的任何異常??梢灾付ㄏ胍裁搭愋偷漠惓2蹲?,這是由以下關(guān)鍵字捕捉出現(xiàn)在括號(hào)中的異常聲明確定的。
try { // protected code } catch( ExceptionName e ) { // code to handle ExceptionName exception }
上面的代碼將捕獲一個(gè)異常的ExceptionName類型。如果您要指定一個(gè)catch塊應(yīng)該處理任何類型的被扔在一個(gè)try塊中的異常,必須把省略號(hào)...,內(nèi)附異常聲明如下括號(hào)之間:
try { // protected code } catch(...) { // code to handle any exception }
下面是一個(gè)例子,它拋出一個(gè)除零異常,我們捕獲它在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)); }
當(dāng)上面的代碼被編譯并執(zhí)行,它在讀取上一節(jié)中創(chuàng)建的文件,并產(chǎn)生以下結(jié)果:
Cannot divide by zero! 5