如果已经在某个地方得到回答,我很抱歉,但到目前为止我还没有找到答案 - 也许我正在寻找错误的事情!
我试图找出如何处理我的OO PHP系统中的错误,该系统用于生成网页。希望这个例子可以解释我的意思。
想象一下,我有一个Content类,一个Form类和一个FormObject类,它包含有关页面内容,Web表单和表单字段的所有信息。所有类都可以通过DB类运行多个MySQL查询。 用户可以在后端创建新内容或表单。当他们这样做时,我使用类来创建数据并将其存储在数据库中。
我还有一个System类,用于生成网页。 System类检查应该在前端显示的内容,构建适当的Content和Form对象,然后生成HTML并将其输出到屏幕。
我对严重错误进行了一些检查,这会阻止代码继续进行。但问题是,我想反馈一些"软错误"到了前端。例如,也许System类构建一个Form对象,然后使用FormObject类构建字段。 FormObject类在数据库中查询字段名称,但找不到字段名称。所以DB类返回一个错误。我希望能够将消息反馈给前端,该消息表明尚未找到字段名称。
获得该问题的最佳方法是什么?#34;软错误"回到System类的消息,可以输出到前端吗? 我意识到在这个特定的例子中它相当简单,但随着更多的类被添加,并且至关重要的是,添加了更多的级别,问题会变得更大。
我想到这样做的一种方法是拥有一个Error类。系统将创建一个Error对象,并在创建时将其传递给每个Content和Form对象。 Form类将相同的Error对象传递给FormItem类。每当发现错误时,都会通过Error类中的方法记录。然后,系统可以访问原始的Error对象并输出所有错误。但是,随着系统的增长,会添加更多的类,并且会创建更多的对象,这可能会让人感到非常困惑。还有更好的方法吗?
答案 0 :(得分:3)
您可能想要使用
收集此类错误。然后,您想要使用您收集的任何内容,并以某种方式将其添加到System
类的输出中。
更具体......
这是使用全局解决方案的示例:
global $softErrorMessages = array();
class A
{
function sampleFunctionA()
{
// [...]
// some code setting $result to some valid value
// or to false if an error occured
if($result === false) // check for validity
{
global $softErrorMessages;
$softErrorMessages[] = "The sample function A caused a soft error";
return;
}
// [...]
// some code requiring a valid $result
}
}
如果您使用此类全局广告,则可以从System
班级轻松访问该广告,并将其内容放入输出的正确位置。
但是,如果执行单元测试,则可能不希望使用全局变量或类似全局的解决方案(如单例)。所以这里是一个错误集合的例子'的方法:
class ErrorCollector
{
private $errors = array();
function addError($error)
{
$this->errors[] = $error;
}
function getErrors()
{
return $this->errors;
}
}
class A
{
private $errorCollector;
function __construct(/* your additional parameters */, ErrorCollector $errorCollector)
{
// [...]
// additional instantiation stuff
$this->errorCollector = $errorCollector;
}
function sampleFunctionA()
{
// [...]
// some code setting $result to some valid value
// or to false if an error occured
if($result === false) // check for validity
{
$this->errorCollector->addError("The sample function A caused a soft error");
return;
}
// [...]
// some code requiring a valid $result
}
}
您只需将ErrorCollector
实例化一次,然后将其传递给所有其他类实例。然后让你的对象履行职责(并可能向ErrorCollector
添加软错误)。完成后,您的System
课程会收到所有错误消息,然后再次将它们放在输出的正确位置。
答案 1 :(得分:0)
异常是处理错误的便捷机制。如果DB返回错误,FormObject
可以抛出一些SoftErrorException
类的异常。然后在System
中,您将捕获此异常并将其呈现为前端。
class System {
public function showFormAction() {
try {
$form = ... // create a form
$this->renderForm($form);
} catch (SoftErrorException $e) {
$this->handleSoftError($e);
}
}
public function handleSoftError(SoftErrorException $e)
{
// Do whatever you want with exceptions: render it
// $this->renderErrorPage($e->getMessage());
// or collect them and show after
// $this->errors[] = $e;
}
}