2011-03-17 96 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'; 
}