2013-01-31 100 views
0

我沒有足夠的PHP和編程經驗,所以我想知道,在我的情況下最好的決定是什麼。 這裏是我的代碼示例:PHP:如何在下面的情況下處理異常

public static function isAscii($string, $type, $length = -1) 
    { 
     if (!is_string($string)) 
      throw new InternalException(ExceptionMessage::invalidFunctionParameterType(__CLASS__, __METHOD__)); 

     if ($length !== -1 && !Str::isValidLength($string, $length)) 
      return FALSE; 

     $ascii_array = Constants::asciiRegex(); 

     if (!preg_match($ascii_array[$type], $string)) 
      return FALSE; 

     return TRUE; 
    } 

我想確保關鍵$type存在陣列$ascii_array。什麼是最好的方式來做到這一點?

我可以提供兩個決定:

  1. 最簡單的。只需用array_key_exists()函數手動檢查關鍵存在。如果鍵不存在 - 也會手動拋出異常。但我認爲這不是一個好主意,檢查這個條件是多餘的,因爲如果我不寫任何東西,PHP編譯器會產生警告(注意:未定義的索引:),我想以某種方式使用它。我發現有一些預定義的異常,例如OutOfBoundsExceptionOutOfRangeException,在Java中使用它們很容易,但似乎PHP不會拋出這些異常,只會引發警告和錯誤。
  2. 使用set_error_handler()函數將錯誤和警告轉換爲例外。但還有一個問題 - 我如何處理所有可能的錯誤?我試圖找到PHP錯誤和警告的完整列表,但it doesn't exist。 所以我不知道如何解決這個問題,請幫助我。 預先感謝您,希望您能夠理解我的問題,即使我的英語水平很差。

P.S.這是一個具有不同類型ascii字符串的正則表達式的數組。 enter image description here

+0

如果你想檢查,如果數組中有某些東西,使用'in_array' - 我沒有明白你在這裏用異常做什麼?即返回「false」和拋出異常之間的區別?或者讓我們說:你期望的結果是什麼?應用程序的行爲應該不同嗎? – dognose

+0

如果你只是想告訴一個字符串是不是ascii,那麼你的函數就會很複雜。如果這不是你正在做的,你應該選擇一個不同的函數名稱。 – crush

+0

我同意,你在這裏有點過度勞累。在您的應用程序設計的這個階段,這種複雜性將來無濟於事。 –

回答

2

我希望我正確理解這個問題 - 你基本上問是否有自然的內部異常而不是運行自己的異常?

還是你只是不知道,你可以這樣做:

try 
{ 
    //some code to try 
    if (!in_array($type, $ascii_array)) { 
     throw new Exception('type not in ascii array'); 
    } 
} 
catch(Exception $e) { 
    die ('my custom exception message: ' . $e->getMessage()); 
} 

,如果我錯過了這一點,讓我知道,我可以更新。

至於沒有拋出你自己的例外的原因......我不能說我知道這個真正的好處。在我看來,in_array()完全可以接受,拋出異常可能只是個人偏好,並不一定是性能的值得關注。

編輯

考慮我的答案和問題,值得注意的是,這個答案是由於結束後在評論認爲PHP不允許你聲明拋出異常像Java那樣的功能接受可能。簡單的說。

所以這個答案只是爲了達到這個目的。 PHP可以聲明一個拋出異常的函數嗎?不,不是默認的。你必須嘗試在函數中自己捕捉異常。

+0

好吧,我寫道我不想手動拋出異常,就像你寫的那樣,因爲我認爲有更好的方法可以使用自然的內部異常機制來做到這一點。這會減少代碼量。但是,如果沒有機會這樣做 - 那麼我會檢查條件並在方法代碼中拋出異常。 –

+0

我會盡量仔細解釋。我想像這樣在Java中編寫代碼,就像'public static function isAscii($ string,$ type,$ length = -1)拋出OutOfRangeException'一樣。如果可能的話,我的方法代碼中沒有必要寫入額外的條件。我不知道PHP的所有可能性,這就是爲什麼我問這個問題。如果這是不可能的 - 沒有問題,只是想確保。 –

+0

我認爲「更好的方式」可能是一個觀點問題。據我所知,php沒有定義像Java這樣的函數的方法,可以看到,因爲它們只是不同的語言。簡單地說,答案是「不」,你不能這樣做,不得不依賴於自我定義。我不是最終的所有權威,但在我8年以上的PHP和衆多框架中,CMS包和採用的代碼我從來不知道這是可能的。 –

相關問題