2012-07-05 117 views
2

有没有人知道为什么此函数在传递无效日期(例如时间戳)时仍然会抛出错误,尽管try-catchDateTime对象上的PHP异常处理

function getAge($date){ 
    try { 
     $dobObject = new DateTime($date); 
     $nowObject = new DateTime(); 

     $diff = $dobObject->diff($nowObject); 
    } 

    catch (Exception $e) { 
     echo 'Error: ', $e->getMessage(); 
    } 

    return $diff->y; 
} 

错误:

Fatal error: Uncaught exception 'Exception' with message 'DateTime::_construct() [datetime.--construct]: Failed to parse time string (422926860) at position 7 (6): Unexpected character' in ... .php:4 Stack trace: #0 ... .php(4): DateTime->_construct('422926860') #1 ... .php(424): getAge('422926860') #2 {main} thrown in/... .php on line 4

非常感谢你提前!

+0

我想你的代码,它完美的作品。捕获异常并显示“错误:...”,但没有发生致命错误。您的错误必须位于代码中的其他位置(哪一个位于第四行?)或您的PHP .ini配置或版本中。我在使用PHP 5.4.0 @ Ubuntu 12.04。 – feeela 2012-07-05 12:25:06

回答

5

克里斯,你不能发现致命的错误,至少你不应该。

报价keparo

PHP不会为您提供的捕致命的错误,因为他们真的不应该抓住任何常规手段。也就是说,你不应该试图从一个致命的错误中恢复过来。与输出缓冲区匹配的字符串绝对不适合。

如果您根本没有其他办法,看看这篇文章的更多信息和可能how-tos

试试这个:

function isDateValid($str) { 

    if (!is_string($str)) { 
    return false; 
    } 

    $stamp = strtotime($str); 

    if (!is_numeric($stamp)) { 
    return false; 
    } 

    if (checkdate(date('m', $stamp), date('d', $stamp), date('Y', $stamp))) { 
    return true; 
    } 
    return false; 
} 

然后:

if isDateValid($yourString) { 
    $date = new DateTime($yourString); 
} 
+0

Thx,Nemanja。是的,你可能是对的。只是,我正试图在网页上显示用户,并希望打印他们的年龄。如果由于输入错误导致函数中断,我认为整个应用程序都不应该中断。所以,你是对的,这是一个致命的错误,但我宁愿喜欢显示的页面没有年龄而不是致命的错误......你觉得怎么样?这是整个页面中断的原因吗? – Chris 2012-07-05 11:39:45

+1

不,我认为这种情况下的致命异常是PHP愚蠢本质的体现。 :)但唉,你必须适应。我会为你编写一个解决方法并编辑我的问题。 – Nemanja 2012-07-05 11:42:28

+0

嘿,你不必乱写,真的!那么使用'checkdate()'来验证正确的日期呢? – Chris 2012-07-05 11:44:21