D本身支援異常處理(exception handling),它會自動處理資源回收工作,但也可以讓程式員手動處理。
擲回異常
Tango提供異常class,可以把它想成包含著描述錯誤數據的元件。當函式出現錯誤時,將會配置一個新的異常元件並且擲回呼叫者。這個擲回的動作會跳過正常函式呼叫傳回機制。
void trouble() { // Do something here, but throw an exception on error. if(someErrorOccurs) throw new Exception("We're in trouble!"); // Any code here will not be executed if the exception is thrown. }
依照上面的語法,當發生錯誤時將會立刻離開此函式且不再執行throw後的任何程式碼。相關異常將會被送回到呼叫者,如果呼叫者忽略此一異常,它就會被放置到呼叫堆疊上直到被處理為止。基本上,所有D程式都包涵一個高層級的異常管理者,它會捕捉任何位被處理的異常,並且將所有都後推回main。
捕捉異常(Catching Exceptions)
當知道非常可能擲回異常時,通常建議在呼叫時就掌握異常。這可以讓程式員知道要怎樣來掌控程式並瞭解它可能的回應。某些時候,程式員會希望立刻中斷執行,某些時候,程式員會希望嘗試其它執行或者直接忽略該異常。通常透過try/catch/finally區塊的結構來處理異常。
Try/Catch Case
try { trouble(); } catch(Exception e) { // Here you can access e like any other variable, but it is invisible outside // the scope of the catch block. If you want, you can 'rethrow' the // exception using the throw statement, or return from the function. We'll // return for simplicity's sake. return; }
Try/Catch/Finally Case
try { trouble(); } catch(Exception e) { return; } finally { // Even if an exception is caught above and the return statement executed, // any code in this finally block will still execute before the current // function returns. }
使用scope描述
finally區塊用在清除資源非常好用,但不能適用於所有情況。當程式員無法確定finally區塊是該函式程式碼的最後一段時,你仍需要重來一次。針對這問題,D的作法是內建提供scope描述。
scope可確保當狀況符合時,就會執行其內相關描述。scope可在區塊內程式碼均被執行完畢又或者被擲回異常而離開。
void main() { scope(success) doSomethingOnSuccess(); scope(failure) doSomethingOnFailure(); scope(exit) { doSomethingAlways(); doSomethingElse(); } // Put your code here. }
success這段只有在main正常結束時才會執行,而當產生異常時則會執行failure這段。而如果有exit這段的話,就會被執行。
沒有留言:
張貼留言