我有一个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 :(得分: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';
}