2012-09-06 121 views
1

我只是第一次在我的代碼中實現異常。哪裏可以定義異常類

對於在類函數中使用的異常,哪裏最好定義異常?

這裏有一個類,代表了一段代碼,我已經寫了幾個功能:

// 
// Do I define my exception here? 
// 
class CreateQuizException extends Exception {} 

class Quiz() 
{ 

    // Define the items in my quiz object 
    $quiz_id = null; 
    $quiz_name = null; 

    // Function to create a quiz record in the database 
    function CreateQuizInDatabase() 
    { 
     // 
     // OR DO I DEFINE IT WITHIN THE FUNCTION?? 
     // 
     class CreateQuizException extends Exception {} 

     try 
     { 

      // Insert the record in to the database 
      $create_quiz = mysql_query("INSERT INTO quizzes (quiz_name) VALUES ("' . $this->quiz_name . '")"); 

      if (!$create_quiz) 
      { 
       // There was an error creating record in the database 
       throw new CreateQuizException("Failed inserting record"); 
      } 
      else 
      { 
       // Return true, the quiz was created successfully 
       return true; 
      } 

     } 
     catch (CreateQuizException $create_quiz_exception) 
     { 
      // There was an error creating the quiz in the database 
      return false; 
     } 
     catch (Exception $other_exception) 
     { 
      // There was another error 
     } 
    } 

} 

它是:該異常將被用於

  • 以前類定義在
  • 只有之內它將被用於的功能
  • 或者我還沒有想到的其他地方?

回答

2

通常我看到和使用的兩處異常放置兩個明顯的理由:

  1. 以外的類定義的,因爲是有可能的是,將引發異常的調用者,我想明確說明這個異常是在公共命名空間。注意到我真的只能看到異常放在定義它們的類文件末尾,但這是首選項,並且沒有功能意義。

    class Foo { 
    } 
    
    class FooException extends Exception {} 
    
  2. 裏面的類定義的,但外面的方法定義的,如果異常是當地的這一類,而不是類的相關外,並不會被調用者處理。通常會引入private訪問修飾符來執行此操作。

    class Foo { 
        public function bar() { 
        } 
        private class FooException extends Exception {} 
    } 
    

    但是,我不相信PHP支持嵌套類,因爲我不能得到一個嵌套類解析的例子。我比Java更多地從Java繪製我的示例。

配售異常的定義裏面的方法似乎過於詳盡,你最終會與例外污染你的代碼,並結了:

class MyFunctionReturnedABadValueAndNowImSad extends Exception {} 
+0

謝謝,這真的清除了一個。關於它的細節太細緻(這個例外名稱讓我笑,大聲btw!) – Luke

+1

@Coulton如果你有兩個不同的錯誤條件可能會發生,你會使用不同類型的異常。從Java中獲取此示例:您有一個FileNotFound異常,其中找不到該文件,或者IOException,IO遇到問題。在你的示例代碼中,沒有任何東西可以產生一個異常(mysql_ *函數,除了被棄用,不使用異常),所以你會很好依靠內置的異常。 – nickb

+0

您可以在PHP中將類定義爲私有的其他類嗎? – Diego

1

使用autoloader function或庫。我一直在使用這一個:

http://static.invenzzia.org/docs/opl/3_0/book/en/autoloader.html

有很好的效果。需要注意的是第二個選項,您必須使用兩種命名空間,或下劃線命名約定:

class <vendor>_<package>_<namespace>_<class_name> {} 

並保存在適當的目錄中的類文件。

然後在您的名稱空間內的單個文件上定義例外。由於異常是類,因此需要時會自動加載。

現在可能看起來過度殺傷力,但從長遠來看它更好。