2011-03-06 60 views
0

有關如何處理業務邏輯錯誤的任何提示?我不是指異常。 例如,免得假設我有一個類:PHP處理Bussines邏輯錯誤。也許是設計模式?

<?php 
class Reactor() { // business class 
    public function shutdown() { 
    if($date > '2 pm') { 
     // show error message to user 
     echo 'you can't shutdown before 2 pm.'; 
     } else { 
     // error while trying to shutdown 
      throw new Exception('Oh my God, it is gonna blow!!'); 
     } 
    } 
} 
?> 

真正的問題是如何傳遞的錯誤信息我的意見? 例外情況對特殊情況有好處。我非常接近將ErroMessage和ErrorCode屬性添加到基礎業務類,並在每次調用業務類方法時檢查它。

回答

2

你實際上在這裏正確的軌道上。你可以在你的ErrorController中處理異常 - 一個在Zend中建模的約定,但在其他許多框架中也是如此。如果你正在DIY它,你可以創建自己的。

此線程有一個更以Zend爲中心的處理方法,但您可以使用ErrorController來實際呈現您的視圖。處理$ e異常類的輸入並從中獲取消息。

Throwing exceptions from model/view/controller in a Zend Framework application

如果你在DIY路線深,你可以優雅,如果你換你更大的塊中的try/catch和測試異常類的所有實例顯示。例如:

class Reactor() { // business class 
    public function shutdown() { 
    if($date > '2 pm') { 
     // show error message to user 
     echo 'you can't shutdown before 2 pm.'; 
     } else { 
     // error while trying to shutdown 
      throw new Exception('Oh my God, it is gonna blow!!'); 
     } 
    } 
} 

//later, in the controller 

$reactor = new Reactor(); 
try{ 
    $reactor->shutdown('1pm'); 
} catch(Your_Custom_Exception $e){ 
    //pass to view 
    $this->view($e->getMessage()); 
} catch(Exception $e){ 
    // woops, serious error. do something useful 
} 
1

我想你應該有這樣的事情。

使用屬性來存儲數據和錯誤消息。我認爲這是不符合邏輯產生錯誤ifelse

class Reactor{ 

    public $date; 
    public $error; 
    public $errorstatus = false; 
    //Use property to store data and errors 

    public function shutdown() { 
    if($date > 2) { 

     $this->errorstatus = true; 
     $this->error['date'] = "You cannot shutdown before 2 pm"; 

    } else 
     return true; 
    } 

} 

$reactor = new Reactor(); 

$reactor->data = 3; 

$reactor->shutdown(); 

if($reactor->errorstatus){ 
    echo $reactor->error['date']; 
} 
else{ 
    echo "Its already two you can shutdown"; 
} 

echo "<br/>"; 

$reactor->data = 1; 

$reactor->shutdown(); 

if($reactor->errorstatus){ 
    echo $reactor->error['date']; 
} 
else{ 
    echo "Its already two you can shutdown"; 
} 

[更新]

public function shutdown() { 
    if($date > 2) { 

     $this->errorstatus = true; 
     $this->error['date'] = "You cannot shutdown before 2 pm"; 

    } else 

     if($this->poweroff) 
      return true; 
     else 
      throw new Exception("ERROR WHILE SHUTTING DOWN"): 
    } 

    private function poweroff() 
    { 
     //if power off then return true 
     //else return false 
    } 
+0

他沒有在if和else上產生錯誤。他意味着其他人應該嘗試關機,但在此過程中可能會出現錯誤。 –

+0

@Sebastian他的意思是,如果試圖關機,他不能再產生錯誤,那麼我將更新代碼 –

+0

是我承認,bussines錯誤應該不會生成一個異常http://stackoverflow.com/questions/534096/should-a-business-rule-violation-throw-an-exception,所以我試圖避免爲bussines logic erro捕獲custon sxceptions。我想我會去與ErrorCode和ErroMessage。感謝所有的幫助。 – uacaman

2

例外的是,你在這種情況下需要什麼。狀態驗證(這是你正在做的事情)將導致無聲或異常。你應該在你的Controller中處理Model引發的異常,將它們轉換爲消息並將它們傳遞給View。