以时尚的方式捕捉异常

时间:2011-03-17 09:30:23

标签: php exception exception-handling

我有一个dateTime的扩展类,它会做一些额外的验证步骤 当给定日期无效时,它会抛出异常 现在我有一些日期为零的MySQL记录(0000-00-00 00:00:00)。在那些情况下,我想显示文本“从不”,所以我必须抓住异常,现在我有这个可怕的混乱......

    try
    {
        $sellDate = new Date();
        $sellDate ->setFromMySQL($this->_data['lastSell']);
        $sellDateDMY = $dateSell->getDMY(TRUE);
    }
    catch (Exception $e)
    {
        if($e->getMessage() == 'Invalid date.')
            $sellDateDMY = 'Never';
        else
            throw new Exception($e->getMessage());
    }
    $info[] = array('desc' => 'Last Sell: '      , 'data' => $sellDateDMY);

有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

取决于抛出的方法。最简单的方法是再次继承Date(可能是NullableDate?)并覆盖该方法而不抛出。然后,getDMY方法将返回null,此时您可以使用三元运算符Never显示?:

通过这种方式,您不必使用丑陋的try / catch,并且对于通过实例化读取有关验证要求的信息的任何人来说,代码的意图也是清楚的。一个NullableDate你肯定不介意它的值是否为空。

答案 1 :(得分:0)

class DateException extends Exception {
  public function __construct(Exception $e) {
     if($e->getMessage() == 'Invalid date.') {
        $this->message = 'Never';
     } else {
         $this->message = $e->getMessage();
     }
  }
}

try
{
    $sellDate = new Date();
    $sellDate ->setFromMySQL($this->_data['lastSell']);
    $sellDateDMY = $dateSell->getDMY(TRUE);
}
catch (Exception $e)
{
    throw new DateException($e);
 }

答案 2 :(得分:0)

您可以开始抛出不同类型的异常。具体问题。而不是通用的捕获,你可以做到这一点

catch (DateInvalidException $de) {
  //code
} catch (DateSomeOtherException $dso) {
 //code
} catch (Exception $e) {
  //general
}

但这不是一个好的解决方案。您正在混淆程序异常和错误验证。

答案 3 :(得分:0)

为Date函数创建自己的Exception类。

class MyOwnDateException extends Exception {
    ... // Do something or probably nothing
}

并在您的代码中调用它:

try {
    if($someErrorYouWantToCatch) {
        throw new MyOwnDateException("error message", 100 /* Error code = optional */);
    }
} catch(MyOwnDateException $mode) {
    $sellDateDMY = 'Never';
}