【问题标题】:Where to define Exceptions for a Class在哪里为类定义异常
【发布时间】:2012-08-31 14:48:38
【问题描述】:

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

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

这是一个类和几个函数,它们代表我编写的一段代码:

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

}

是吗:

  • 将使用异常的类定义之前
  • 将在其中使用的函数中
  • 或者其他我没有想到的地方?

【问题讨论】:

    标签: php class exception-handling


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      通常我已经看到并使用了两个地方放置异常,原因有两个:

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

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

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

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

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

      class MyFunctionReturnedABadValueAndNowImSad extends Exception {}
      

      【讨论】:

      • 谢谢,这真的很清楚。关于它太细化的注释(那个例外的名字让我笑了,顺便说一句!)
      • @Coulton 如果您有两种可能发生的不同错误情况,您将使用不同类型的异常。以 Java 中的这个示例为例:您有一个 FileNotFound 异常,即找不到文件,或者一个 IOException,即 IO 遇到问题。在您的示例代码中,没有任何东西可以产生异常(mysql_* 函数,除了被弃用之外,不要使用异常),所以您可以依赖内置的异常。
      • 你可以在 PHP 的其他类中将类定义为私有的吗?
      • @Diego - 直接来自我的帖子:但是,我不相信 PHP 支持嵌套类,因为我无法获得一个嵌套类示例来解析。我更多地使用 Java 而非 PHP 来绘制我的示例。
      猜你喜欢
      • 2021-12-18
      • 2021-12-29
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多