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
        }
    }

}

それは...ですか:

  • 例外が使用されるクラス定義の
  • で使用される関数内でのみ
  • または私が考えていなかった他のどこか?
4

2 に答える 2

2

通常、私は2つの明確な理由から、例外の配置に2つの場所を見て使用しました。

  1. クラス定義の外では、例外が呼び出し元にスローされる可能性があるため、この例外がパブリック名前空間にあることを明示したいと思います。例外は、それらが定義されているクラスファイルの最後に配置されているだけであることに注意してください。ただし、これは設定であり、機能上の重要性はありません。

    class Foo {
    }
    
    class FooException extends Exception {}
    
  2. クラス定義の内部ですが、メソッド定義の外部では、例外がこのクラスにローカルであり、クラスの外部には関係がなく、呼び出し元によって処理されない場合。通常、privateこれを強制するためにアクセス修飾子が導入されます。

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

    ただし、ネストされたクラスの1つの例を解析することができないため、PHPがネストされたクラスをサポートしているとは思いません。私はPHPよりもJavaから例を描いています。

メソッド内に例外定義を配置するのは細かすぎるようです。コードを例外で汚染し、次のようになります。

class MyFunctionReturnedABadValueAndNowImSad extends Exception {}
于 2012-09-06T18:14:51.363 に答える
1

オートローダー関数またはライブラリを使用します。私はこれを使用しています:

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

非常に良い結果が得られました。2番目のオプションでは、名前空間またはアンダースコアの命名規則のいずれかを使用する必要があることに注意してください。

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

クラスファイルを適切なディレクトリに保存します。

次に、名前空間内の個々のファイルに例外を定義します。例外はクラスであるため、必要に応じて自動ロードされます。

今はやり過ぎに見えるかもしれませんが、長期的にはより良いです。

于 2012-09-06T18:26:21.207 に答える