自2000年以来,我一直在处理PHP,但不是很积极,而且我对PHP5的了解非常可怕。最近,经过5年的休整后,我对网络开发产生了兴趣,并开始研究一个项目。我为该项目编写了一个相当大的类,但到目前为止还没有任何特定的错误处理。
该类的目的是解析具有特定布局的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爱好,我发现了异常。我的问题很简单,我不明白如何正确使用它们。如果我应该使用它们。我希望我的班级能够携带;我可以使用异常来处理错误吗?如果是,我如何传达错误(即翻译我的传统错误处理)?或许还有更好的方法,我不知道。
任何帮助表示赞赏:)
答案 0 :(得分:0)
我没有看到你如何做到这一点的问题,但是如果你想深入了解Exceptions,请学习如何使用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()
}
答案 1 :(得分: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
}
这里如果调用者没有给我们一个非空字符串,我们抛出一个Exception,因为我们没有预料到这一点,我们无法保证在没有正确值的情况下成功完成该方法。没有理由继续使用该方法。我们向调用者发送有关问题的消息的异常。希望他们在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类警告。
就像我说的那样,我倾向于使用Exceptions进行更多工作,因为它们也很容易扩展,易于使用日志记录等。我几乎总是会有一个自定义的Exception类,它扩展自PHP的基类Exception类,它也提供日志记录等。
要考虑的另一件事是全局错误处理和Exceptoin处理。我强烈建议使用这些,并将它们作为任何新项目中的第一行代码。同样,它可以让您更好地控制记录错误/异常的方式,而不是默认情况下。