【问题标题】:PHP Handling Business Logic Errors. Maybe a Design-pattern?PHP 处理业务逻辑错误。也许是设计模式?
【发布时间】:2011-03-06 04:12:08
【问题描述】:

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

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

【问题讨论】:

    标签: php design-patterns logic


    【解决方案1】:

    您实际上是在正确的轨道上。您可以在 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
    }
    

    【讨论】:

      【解决方案2】:

      在这种情况下,您需要的正是异常。状态验证(这就是你正在做的)将导致沉默或异常。您应在 Controller 中处理模型抛出的异常,将它们转换为消息并将它们传递给 View。

      【讨论】:

        【解决方案3】:

        我认为你应该有这样的东西。

        使用属性来存储数据和错误信息。而且我认为为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
            }
        

        【讨论】:

        • 他也没有在 if 和 else 上产生错误。他的意思是 else 实际上应该尝试关闭,但过程中可能会出现错误。
        • @Sebastian 他的意思是如果尝试关闭,他就不能产生错误,那么我会更新代码
        • 我的意思是业务错误不应该产生异常stackoverflow.com/questions/534096/…,所以我试图避免捕获业务逻辑错误的自定义错误。我想我会选择 ErrorCode 和 ErroMessage。感谢所有敌人的帮助。
        • @uacaman 例如,您会收到错误:- (10/0) 这是无穷大,这是一个错误:- 除以零。在这种情况下,你会得到像 syantax 错误这样的丑陋错误。在这种情况下,您应该使用 try catch 来生成异常。在业务逻辑中,您只允许某些操作,例如(在 2 之前关闭),而是生成逻辑错误消息
        猜你喜欢
        • 2019-10-10
        • 2018-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-15
        • 2011-02-07
        • 2013-02-18
        • 2015-04-20
        相关资源
        最近更新 更多