尝试Catch块应插入Controller或Model?

时间:2016-02-24 15:54:06

标签: php api rest pdo

我有一个结构项目如下:

/Controller
    test.php
/Models
    test_model.php

现在,当我执行请求时,模型test.php会在相应的模型中查询请求,在本例中为test_model.php。这没问题。现在我的问题是:我应该在test.php类(控制器)或test_model.php类中处理exceptino?

为了执行所有数据库对话,我创建了一个带有pdo的数据库层。 我设置了:

$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

用于处理异常。一切顺利,但我怀疑。一个练习的例子:

<?php

    include "test_model.php";

    public function selectInformation()
    {
        try
        {
            $test = new Test_Model(); //just as example..
            return $test->selectUserInfo(); // test_model
        }catch(Exception $ex)
        {
              echo json_encode(array("success" => false, "message" => $ex->getMessage()));
              exit();
        }
    }

    ...

这里是Test_Model类:

   <?php

      class Test_Model extends PDO
      {

         public function __construct()
         {
               parent::__construct();
               $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
               $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
         }

         public function selectUserInfo()
         {
             //I removed most part of the code, essentially here an exception is fired by a non correct db table name
         }

实际上我管理Test课程中的所有例外情况,但这是一个好习惯吗?我只使用每个Model来返回数据库中的结果。实际上Model课程中没有。

2 个答案:

答案 0 :(得分:3)

在模型或控制器中都没有。

必须在错误处理程序中处理错误异常。

不必单独“处理”对模型的每次调用,而是必须在一个地方处理所有错误。这称为错误处理程序。

不应该在JSON中发送错误消息或行号。此信息必须在本地记录,而不必在外部显示内部错误。只有一个普遍的借口才能显示出来。

应该有一个通过set_error_handler设置的错误处理程序,它必须负责处理错误。它应该记录生产中的错误,而只有一个普遍的借口发送到外面。

请注意,如果出现错误,请发送5xx系列

的相应HTTP状态代码非常重要

答案 1 :(得分:0)

您应该将try catch块放在控制器中。