PHP处理业务逻辑错误。也许是设计模式?

PHP处理业务逻辑错误。也许是设计模式?,php,design-patterns,logic,Php,Design Patterns,Logic,有关于如何处理业务逻辑错误的提示吗?我不是说例外。 例如,假设我有一个类: <?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.'; }

有关于如何处理业务逻辑错误的提示吗?我不是说例外。 例如,假设我有一个类:

<?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属性添加到基本业务类,并在每次调用业务类方法时进行检查

事实上,你在这条路上走对了。您可以在ErrorController中处理异常—Zend中建模的约定,但在许多其他框架中也是如此。如果你自己动手做的话,你可以自己创造

这个线程有一个更以Zend为中心的处理方法,但是您可以使用ErrorController来实际渲染视图。处理$e异常类的输入并从中获取消息

如果您深入DIY路线,那么如果您将较大的块包装在try/catch中并测试exception类的所有实例,则可以优雅地显示它。例如:

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
}

实际上,你在这条路上走对了。您可以在ErrorController中处理异常—Zend中建模的约定,但在许多其他框架中也是如此。如果你自己动手做的话,你可以自己创造

这个线程有一个更以Zend为中心的处理方法,但是您可以使用ErrorController来实际渲染视图。处理$e异常类的输入并从中获取消息

如果您深入DIY路线,那么如果您将较大的块包装在try/catch中并测试exception类的所有实例,则可以优雅地显示它。例如:

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
}

我想你应该吃这样的东西

使用属性存储数据和错误消息。我认为为if和else生成错误也是不合逻辑的


我想你应该吃这样的东西

使用属性存储数据和错误消息。我认为为if和else生成错误也是不合逻辑的


在这种情况下,例外情况正是您所需要的。状态验证—您正在执行的操作将导致沉默或异常。您应该在控制器中处理模型抛出的异常,将其转换为消息并将其传递给视图。

异常正是您在这种情况下所需要的。状态验证—您正在执行的操作将导致沉默或异常。您应该在控制器中处理模型抛出的异常,将它们转换为消息并传递给视图。

他也不会在if和else上生成错误。他是说else实际上应该尝试关闭,但过程中可能会出现错误。@Sebastian是不是说如果尝试关闭,他就不能生成错误,那么我将更新codeIs是我的理解,即业务错误不应该生成异常,因此,我试图避免为业务逻辑错误捕捉custon sxceptions。我想我将使用错误代码和错误消息。感谢所有人的帮助。@uacaman您会得到错误,例如:-10/0是无穷大,这是一个错误:-被零除。在这种情况下,您会得到像syantax错误这样的丑陋错误。在这种情况下,您应该使用try-catch生成异常。在业务逻辑中,您只允许一些操作,例如在2之前关机,而是生成逻辑错误消息。他也没有在if和else上生成错误。他是说else实际上应该尝试关闭,但过程中可能会出现错误。@Sebastian是不是说如果尝试关闭,他就不能生成错误,那么我将更新codeIs是我的理解,即业务错误不应该生成异常,因此,我试图避免为业务逻辑错误捕捉custon sxceptions。我想我将使用错误代码和错误消息。感谢所有人的帮助。@uacaman您会得到错误,例如:-10/0是无穷大,这是一个错误:-被零除。在这种情况下,您会得到像syantax错误这样的丑陋错误。在这种情况下,您应该使用try-catch生成异常。在业务逻辑中,您只允许一些操作,例如在2之前关机,而生成逻辑错误消息
    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
    }