2011-03-17 52 views
0

我有一个扩展的类为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); 

什么更好的办法来做到这一点?

+0

你可以'抛$é;',无需'new'另一个'异常($é - >的getMessage())'。 – 2011-03-17 09:54:45

回答

2

取决于抛出的方法。最简单的方法是再次对Date进行子类化(可能为NullableDate?),并重写该方法不抛出。然后getDMY方法将返回null,此时您可以使用三元运算符?:显示Never

这样你就不必使用难看try/catch,以及代码的意图也很清楚的人谁读它的信息的验证要求 - 通过实例化一个NullableDate你绝对不介意它的价值是否为空。

+0

似乎是一个明智的解决方案,但我开始认为我在脚下开枪自杀......: - / – 2011-03-17 09:42:03

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); 
} 
0

你可以开始扔不同类型的例外。具体到这个问题。相反,通用抓的,你可以这样做

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

但是,这并不是一个很好的解决方案。你在混合程序例外和错误验证。

0

为您的日期函数创建您自己的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'; 
}