gpt4 book ai didi

php - 处理类中的错误,我应该使用什么方法?

转载 作者:行者123 更新时间:2023-12-03 08:59:03 26 4
gpt4 key购买 nike

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

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

我要解析的 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 布局没有 check out ,我的类(class)不应该尝试解析它。传统上我会这样做:
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 爱好以来,我发现了异常。我对它们的问题只是我不明白如何正确使用它们。如果我应该使用它们。我希望我的类(class)是可移植的;我可以使用异常来处理错误吗?如果是,我如何传达错误(即翻译我的传统错误处理)?或者也许有更好的方法可以采取,我不知道。

任何帮助表示赞赏:)

最佳答案

你当然在思考正确的道路。通常,我喜欢将类设计与错误处理逻辑分开。换句话说,我不想拥有一堆 $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 block 中调用此方法,并且可以优雅地处理异常并将其沿调用堆栈向上传递。如果没有,您的代码刚刚停止执行,因为未捕获的异常导致 fatal error (在测试中很容易捕获)。

触发错误,老实说,我使用的少得多,通常更多地用于调试、警告目的。这方面的一个示例可能是您仍想使用的已弃用方法,但您想给用户一个错误
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 类扩展而来,它还提供日志记录等。

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

关于php - 处理类中的错误,我应该使用什么方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13617447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com