我搜索了很長時間(這裏也是),已閱讀許多PHP代碼,但仍然無法找到滿意的答案。這看起來可能太廣泛了,但它確實堅持不懈 - 最後對我來說。能否請你幫忙?異常重新投擲通過層和狀態代碼的使用
在一個php網站,我有PDO作爲DAL,BLL對象使用什麼,它們是從UI調用的。現在,如果發生某種事情,PDO將拋出PDOException。當然,UI層不需要知道關於PDOExceptions的任何信息,所以BLL對象會捕獲它。但現在呢?
我已閱讀,
- 例外是真正的例外情況和
- 一個重新拋出從較低層的異常爲了不得到上層低級別的異常。
讓我說明我的問題(請不要注意函數參數):
class User
{
function signUp()
{
try
{
//executes a PDO query
//returns a code/flag/string hinting the status of the sign up:
//success, username taken, etc.
}
catch (PDOException $e)
{
//take the appropriate measure, e.g. a rollback
//DataAccessException gets all the information (e.g. message, stack
//trace) of PDOException, and maybe adds some other information too
//if not, it is like a "conversion" from PDOException to DAE
throw new DataAccessException();
}
}
}
//and in an upper layer
$user = new User();
try
{
$status = $user->signUp();
//display a message regarding the outcome of the operation
//if it was technically successful
}
catch (DataAccessException $e)
{
//a technical problem occurred
//log it, and display a friendly error message
//no other exception is thrown
}
這是一個正確的解決方案? 當重新拋出PDOException時,我認爲不適合使用異常鏈(因爲這隻會使調試信息變得冗餘; DataAccessException會獲取所有內容,包括來自PDOException的完整堆棧跟蹤)。
在此先感謝。
看起來對我來說很好。只要你確定;當您將PDO異常重新拋出爲更通用的DAE異常時,在轉換中不會丟失任何調試信息。理想情況下,您應該將它作爲基本Exception類中指定的第三個參數傳遞,因此它將被傳遞。 – Atli 2009-11-27 22:55:15
謝謝您的回覆!我考慮了異常鏈(傳遞PDOE作爲第三個參數),但在這種情況下(與php.net示例相反),我確實沒有看到這一點:將有PDOE包含所有有用的調試信息,包裝在另一個具有相同數據,但是來自上一層的異常中。 – Piedone 2009-11-28 10:51:55