尝试抓住新的例外,这是一个很好的做法吗?

时间:2015-03-19 03:56:17

标签: php validation exception exception-handling

这是尝试抓住一个好习惯吗?如果我实现这个,我会遇到问题吗?考虑单元测试。

public function index($user)
{
    try {
        $message = $this->_validate($user);
    } catch (MyCustomException $e) {
        $message = $e->getMessage();
    }

    return $message;
}

private function _validate($user)
{
    if ($user != 'test') throw new MyCustomException('Invalid User');
    return 'Valid User';
}

更新(增加另一个例子) 如果我从SQL检索数据然后没有检索到任何记录,则抛出异常。

public function retrieveData($args)
{
    $codeTable = $model->getCodeTables('code_tables', $args);
    if (empty($codeTable)) throw new MyCustomException($this->getCustomMessage()['sysMsgDataDoesNotExists']);

    // more codes here

    return $codeTable;
}

public function index($args)
{
    try {
         $this->retrieveData($args);
         // if data retrieve is not empty, execute codes here like insert, delete, update other records or other fancy logic
         $message = 'success';
    } catch (MyCustomException $e) {
         $message = $e->getMessage();
    }

    return $message;
}

在第二个例子中,我的目标是在没有检索到数据时立即进行捕获。而不是我做这样的事情。

public function retrieveData($args)
{
    $codeTable = $model->getCodeTables('code_tables', $args);
    if (empty($codeTable)) return $this->getCustomMessage()['sysMsgDataDoesNotExists'];

    // more codes here

    return $codeTable;
}

public function index($args)
{
    $data = $this->retrieveData($args);
    if (is_array($data)) {
       // if data retrieve is not empty, execute codes here like insert, delete, update other records or other fancy logic
       $message = 'success';
    } else {
       $message = $data; 
    }    
    return $message;
}

4 个答案:

答案 0 :(得分:2)

当您遇到无法处理的情况时,您应该throw,而不是使用throw来处理某些事情。

在这种情况下,truefalse的标记是合适的。

public function index($user)
{
    return isValid($user) ? 'Valid user' : 'Invalid user';
}

private function isValid($user)
{
    return $user === 'test';
}

如果您正在编写需要传递参数的函数,并且未传递该参数,则throw有意义。这意味着开发人员忘了通过它,让他知道的最好方法是扔掉,以便一切都停止。

function foo($a, $b) {
  if (!$a || !$b) {
    throw new Exception('Gotta have parameters, dude!');
  }
  // etc
}

答案 1 :(得分:1)

这不是例外的预期用途,而是不好的做法。例外情况适用于那些不可预测和/或不受当前开发人员控制的情况。

在您的情况下,您可以预测某些用户不会“测试”用户,否则为什么要进行测试。你在这里做的是使用一个例外只是为了返回一个你接收回应的替代消息。因此,您不需要抛出异常,只需返回指示此情况的替代消息。

答案 2 :(得分:0)

  • 有些人会争辩说,在使用数据库并且存在潜在的SQL错误时,应该抓住这些错误并将其记录/冒泡给用户。

  • 其他人会在try catch中包装任何外部库。

  • 就我个人而言,我想把我的所有代码都包装在try catch中并冒出异常(将它们一直扔到控制器),我会在那里记录它们,如果找到它们就会在用户友好中处理输出格式。

外卖 - 如果发生任何不可预测的事情,它们只是一种以优雅方式走出逻辑的方法。

以下是我将如何将索引包装在一起以保持一致的示例:

public function index( $args )
{
    // Init return.
    $aReturn = array(); // Or object.
    try
    {
        $aFetch = $this->retrieveData( $args );
        if (!empty( $aFetch) ) 
        {
            $aReturn = $aFetch;
        }
    }
    catch( Exception $oException )
    {
        // Optionally log exception or do nothing.
        // log( $oException );
    }
    // Return will always be an array either with data or empty.
    return $aReturn;
}

答案 3 :(得分:0)

对于其他示例,我想这取决于您真正查询的内容。

例如:

  • 如果查询是某些搜索,那么您可能无法获得任何结果。您的包装器/ orm应该返回一个空数组并将其视为正常情况。您可以检查行数并决定要做什么。

  • 如果查询类似于“我应该在此日期使用的税率”,并且应用程序应该在使用之前预先加载信息,那么这可能是异常的原因。但只能从类似get_tax_rate()的函数,而不是从通用数据库查询代码。 (即使这样,如果有一些用户公开的页面用于定义税率并且“我没有税率,请定义一个”是一个有效的错误消息,它可能不需要例外)

  • 任何你无法控制的情况,例如连接断开,超时,获取不符合你模型的数据等,都是抛出异常的理由。