在哪里定义类的例外

时间:2012-09-06 18:07:23

标签: php class exception-handling

我只是第一次在我的代码中实现异常。

对于在类函数中使用的异常,哪里最好定义异常?

这是一个类和一些代表我编写的代码的函数:

//
// 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 个答案:

答案 0 :(得分:2)

我通常会看到并使用两个地方进行异常展示,原因有两个:

    类定义的
  1. 外部,因为可能会向调用者抛出异常,并且我希望明确表示此异常位于公共名称空间中。可能有用的是要注意我实际上只看到在定义它们的类文件末尾放置的异常,但这是首选项,没有任何功能意义。

    class Foo {
    }
    
    class FooException extends Exception {}
    
  2. 类定义的内部,但方法定义的外部,如果异常是此类的本地,在类外部不相关,并且不会被来电者处理。通常,会引入private访问修饰符来强制执行此操作。

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

    但是,我不相信PHP支持嵌套类,因为我无法获得要解析的嵌套类的一个示例。我从Java中获取的示例比PHP更多。

  3. 在方法中放置异常定义似乎过于细化,您最终会使用异常污染代码并最终得到:

    class MyFunctionReturnedABadValueAndNowImSad extends Exception {}
    

答案 1 :(得分:1)

使用autoloader function或库。我一直在用这个:

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

效果非常好。请注意,对于第二个选项,您必须使用命名空间或下划线命名约定:

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

并将类文件保存在正确的目录中。

然后在命名空间内的单个文件上定义例外。由于Exceptions是类,因此需要时会自动加载。

现在看起来有点矫枉过正,但从长远来看它会更好。