2011-03-06 59 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。