2012-06-19 84 views
1

我想要一些系統,我不必一直看着Exception類並一次性複製狀態碼或文本。我也不想在捕捉異常後不斷寫出簡單的英文錯誤消息。這看起來既可以完成,又可以輕鬆實現IDE自動完成!這是處理異常消息的好方法嗎?

下面是一些演示代碼:

<?php 

class Thrive_URL_Exception extends Thrive_PrettyException 
{ 
    const MISSING_CURL = "The cURL PHP extension must be enabled."; 
    const MISSING_URL = "A URL has not been supplied or set."; 
    const INVALID_URL = "The URL '%s' is not valid."; 
    const BLANK_URL = "The URL '%s' contained no data. It is probably invalid."; 
    const CONNECTION_TIMED_OUT = "The connection timed out."; 
    const FILE_NOT_FOUND = "404: '%s' could not be found."; 
    const NOT_ACCESSIBLE = "%d: '%s' is not currently accessible."; 
    const PERMISSION_DENIED = "Permission denied."; 
} 

class Thrive_URL_Downloader 
{ 
    public function fetch($url) 
    { 
     // Make sure the URL is valid. 
     if (!self::isURLValid($url)) 
     { 
      throw new Thrive_URL_Exception(Thrive_URL_Exception::INVALID_URL, array($url)); 
     } 

     $ch = curl_init(); 
     curl_setopt_array($ch, array(CURLOPT_URL => $url, 
       CURLOPT_RETURNTRANSFER => 1, 
       CURLOPT_HEADERFUNCTION => array($this, 'captureHeader'), 
       CURLOPT_TIMEOUT => 30, 
      ) 
     ); 

     $data = curl_exec($ch); 
     curl_close($ch); 

     if ($data === false || is_null($data) || $data == '') 
     { 
      throw new Thrive_URL_Exception(Thrive_URL_Exception::BLANK_URL, array($url)); 
     } 

     // TODO: Need to handle HTTP error messages, such as 404 and 502. 
     $info = $this->getUrlInfo($ch); 

     if ($info->httpCode == 401) 
     { 
      throw new Thrive_URL_Exception(Thrive_URL_Exception::PERMISSION_DENIED); 
     } 

     if ($info->httpCode == 404) 
     { 
      throw new Thrive_URL_Exception(Thrive_URL_Exception::FILE_NOT_FOUND, array($url)); 
     } 

     if (in_array($info->httpCode, array(400, 401, 402, 403, 500, 501, 502, 503))) 
     { 
      throw new Thrive_URL_Exception(Thrive_URL_Exception::NOT_ACCESSIBLE, array($info->httpCode, $url)); 
     } 

     $urlContent = new Thrive_Model_URLContent; 
     $urlContent->url = $url; 
     $urlContent->headers = $this->headers; 
     $urlContent->info = $info; 
     $urlContent->content = $data; 

     return $urlContent; 
    } 
} 

我的問題是,是否有一個明顯更好的方式做這樣的事情?

+0

我會說這是更適合[代碼評論](http://codereview.stackexchange.com/faq) – vascowhite

+0

他們是獲得設計模式幫助的地方嗎? –

+0

是的,我鏈接到FAQ。 – vascowhite

回答

2

恕我直言,這不是最好的解決方案。

您的異常類正在破壞Single Responsibility Principle (SRP)­Wikipedia,因爲您對不同類型的錯誤使用相同的異常類。我要做的是:

針對不同類型的錯誤創建唯一的例外類:

InvalidUrlException 
PermissionDeniedException 
FileNotFoundException (probalny this exception exists in core php) 

然後你可以使用EXCETION不傳遞任何消息。該消息是類的私有部分。

對於更大的應用這種解決方案是更好的恕我直言。

+0

+1我從來沒有想過這個...... –

+0

這是真的不同種類的錯誤?我可以發現很多Thrive_URL_fetch,一個無效參數和一個運行時異常。但不是更多。保重。順便說一句。 HTTP錯誤類不能很好地表示。 – hakre

+0

對我來說是的,我看到這些組的錯誤:URL,CURL,IO和權限。所以我會在這種情況下實現至少4個異常類(當然當使用OOP時) – drupality