2012-07-05 73 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