2012-01-02

D 筆記 -- 錯誤管理

主要是參考Learn to Tango with D的內容,把我想記下來的部份寫在這… 



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這段的話,就會被執行。

沒有留言: