0

自 2000 年以来我一直在处理 PHP,但不是很活跃,而且我对 PHP5 的了解非常糟糕。最近,我在休息了 5 年之后重新对 Web 开发产生了兴趣,并开始着手一个项目。我为那个变得相当大的项目编写了一个类,但到目前为止还没有任何特定的错误处理。

该课程的目的是解析具有特定布局的 HTML 文件并处理其数据,这或多或少是我重新投入游戏的训练练习。我现在开始重写这个类,我决定是时候对错误处理更专业一点,而不是简单地使用 die(),到目前为止我一直在使用它。我想我们都同意这是一个可怕的方向。我希望该课程完全独立于项目,以便我可以将其分发给任何想要使用它的人。

我要解析的 HTML 文件包含具有特定边框颜色的表格、具有特定 bgcolors 的 trs,但元素的数量是动态的。为了验证 HTML 文件是否确实具有这种特定模式,我有以下示例(伪)代码

public function Validate() {

    $tables = getall('table', $this->data);

    foreach ($tables as $table) {
        if ($table->bordercolor != 'navy' && $table->cellspacing != 0) {
            // Error
        }

        foreach ($tables->tr as $tr) {
            if ($tr->bgcolor != '#fff') {
                // Error
            }
        }
    }
    return true;
}

它说 // 错误的地方,HTML 布局没有检出,我的班级不应该尝试解析它。传统上我会这样做:

if ($table->bgcolor != '#fff') {
    $this->error = 'Invalid HTML layout';
    return false;
}

从我调用我将使用的方法的地方

if ($class->Validate() === false) {
    exit_with_error($class->GetError()); // Simple return of $this->error
}

我一直认为这是一种不错的方法,因为它很简单。然而,这也是一个缺点,因为除了文本本身之外,它并没有真正提供任何关于错误的深入信息。我看不到错误是在哪里触发的,调用了哪些方法等。

自从我恢复我的 PHP 爱好以来,我发现了异常。我对它们的问题只是我不明白如何正确使用它们。如果我应该使用它们。我希望我的课程是可移植的;我可以使用异常来处理错误吗?如果是,我如何传达错误(即翻译我的传统错误处理)?或者也许有更好的方法可以采取,我不知道。

任何帮助表示赞赏:)

4

2 回答 2

0

我认为您的操作方式没有问题,但是如果您想深入研究异常,请学习如何使用 try/catch 语句。通常它会是这样的:

try {
  //some code that may cause an error here
} catch (Exception e) {
  //if a error is found, or an exception is thrown in the try statement, whatever here will execute
  //you can get the error message by using e->getMessage()
}

你可以在这里阅读更多信息:http: //php.net/manual/en/language.exceptions.php

于 2012-11-29T01:48:39.917 回答
0

你当然在思考正确的道路。通常,我喜欢将类设计与错误处理逻辑分开。换句话说,我不想$this->error = 'something'在类中有一堆逻辑,为什么要向每个类添加额外的代码来存储/处理/报告错误。

现在您将了解异常与错误以及何时使用它们。这可能是一个有争议的话题,但我个人的偏好主要是在代码中遇到无法恢复或没有逻辑处理的点的情况下抛出异常。我通常使用的一个很好的例子是在任何需要某种类型或值的参数的类方法的开头抛出异常。像这个例子:

public method set_attribute($value) {
   if (empty($value)) {
      throw new Exception('You must send me something');
   } else if (!is_string($value)) {
      throw new Exception("You sent me something but it wasn't the string I was expecting.");
   }
   // method logic here
}

在这里,如果调用者没有给我们一个非空字符串,我们会抛出一个异常,因为我们没有预料到这一点,如果没有正确的值,我们不能保证方法的成功完成。根本没有理由继续使用该方法。我们向调用者发送异常消息,其中包含有关问题的消息。希望他们在 try-catch 块中调用此方法,并且可以优雅地处理异常并将其沿调用堆栈向上传递。如果没有,您的代码刚刚停止执行,因为未捕获的异常导致致命错误(在测试中很容易捕获)。

触发错误,老实说,我使用得更少,通常更多地用于调试和警告目的。这方面的一个示例可能是您仍想使用的已弃用方法,但您想给用户一个错误

public function old_method() {
   trigger_error('This method had been deprecated. You should consider not using it anymore.'. E_USER_WARNING);
   // method logic
}

当然,您可以自己在这里触发任何级别的 E_USER 类警告。

就像我说的,我倾向于更多地使用异常,因为它们也很容易扩展,以便与日志记录等一起使用。我几乎总是会有一个自定义 Exception 类,它从 PHP 的基本 Exception 类扩展而来,它还提供日志记录等。

要考虑的另一件事是全局错误处理和异常处理。我强烈建议使用这些并将它们作为任何新项目中的第一行代码。同样,它可以让您更好地控制记录错误/异常的方式,而不是默认情况下获得的信息。

于 2012-11-29T01:58:00.140 回答