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

通常,出于两个不同的原因,我已经看到并使用了两个放置异常的地方:

  1. 在类定义之外,因为有可能将异常抛出给调用者,我想明确指出这个异常在公共命名空间中。值得注意的是,我确实只看到异常放置在定义它们的类文件的末尾,但这是首选项,没有功能意义。

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

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

    但是,我不相信 PHP 支持嵌套类,因为我无法获得一个嵌套类示例来解析。我更多地从 Java 而非 PHP 中绘制我的示例。

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

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

使用自动加载器函数或库。我一直在使用这个:

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

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

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

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

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

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

于 2012-09-06T18:26:21.207 回答