2009-11-27 59 views
0

我搜索了很長時間(這裏也是),已閱讀許多PHP代碼,但仍然無法找到滿意的答案。這看起來可能太廣泛了,但它確實堅持不懈 - 最後對我來說。能否請你幫忙?異常重新投擲通過層和狀態代碼的使用

在一個php網站,我有PDO作爲DAL,BLL對象使用什麼,它們是從UI調用的。現在,如果發生某種事情,PDO將拋出PDOException。當然,UI層不需要知道關於PDOExceptions的任何信息,所以BLL對象會捕獲它。但現在呢?

我已閱讀,

  1. 例外是真正的例外情況和
  2. 一個重新拋出從較低層的異常爲了不得到上層低級別的異常。

讓我說明我的問題(請不要注意函數參數):

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的完整堆棧跟蹤)。

在此先感謝。

+0

看起來對我來說很好。只要你確定;當您將PDO異常重新拋出爲更通用的DAE異常時,在轉換中不會丟失任何調試信息。理想情況下,您應該將它作爲基本Exception類中指定的第三個參數傳遞,因此它將被傳遞。 – Atli 2009-11-27 22:55:15

+0

謝謝您的回覆!我考慮了異常鏈(傳遞PDOE作爲第三個參數),但在這種情況下(與php.net示例相反),我確實沒有看到這一點:將有PDOE包含所有有用的調試信息,包裝在另一個具有相同數據,但是來自上一層的異常中。 – Piedone 2009-11-28 10:51:55

回答

0

我瞭解您的文章一個很好的資源是這樣的: Api design

我認爲,你做你的家庭作業(如果我可以用這個短語),但你忘了爲什麼這件事情正在做的原因。在你的例子中,我會創建類似於

SignUpException 

這會告知上層關於註冊的問題。你在這裏所做的基本上是用一個不同的命名數據庫來掩蓋數據庫異常,這本質上是一回事,儘管在編程上是正確的,但它首先忽略了爲什麼要這麼做的原因。

+0

謝謝你的回答!我很高興我幾乎完成了我的作業:-)。你是完全正確的,我錯過了這一點。我要去看視頻,看起來很有趣。 – Piedone 2009-11-28 11:10:12