我正在我的系统中开发一些使用php异常类的多个子类的低端代码。基本上我有几个类别的例外。我想要做的是两件事。
我想知道的是我应该使用某种try / catch封装应用程序吗?我根本不喜欢这个想法,这听起来像是一个非常糟糕的实现。我也不喜欢set_exception_handler的想法,除非我可以将函数设置为对象的方法。原因是如果我指定一个函数来处理异常,这将是应用程序中的第一个函数。其他一切都是对象的方法。
希望我已经提供了有关该方案的足够详细信息。我正在努力保持这种清洁并遵循最佳做法。这段代码将用于OSS,所以我不想写它10次:)
答案 0 :(得分:23)
在执行初期致电set_exception_handler
(不要忘记考虑error_reporting()
)。 set_exception_handler
将php称为"callback"的参数作为其参数。你可以像这样传递一个对象方法:
// $object->methodName() will be called on errors
set_exception_handler(array($object, 'methodName'));
使用try/catch
包裹您的调度代码以捕获任何会抛出异常的代码。代码的catch部分将捕获所有代码的异常,以及一些 php错误,这些错误本身不会产生异常(例如fopen
或其他),感谢您的{{ 1}}以上呼叫。 php手册说明:
以下错误类型不能 使用用户定义的函数处理: E_ERROR,E_PARSE,E_CORE_ERROR, E_CORE_WARNING,E_COMPILE_ERROR, E_COMPILE_WARNING,以及大部分内容 E_STRICT在文件中引发了 调用set_error_handler()。
根据需要记录错误。
创建一个错误页面模板(“视图”),该模板在Exception对象(“模型”)上运行,并在开发过程中为您打印整个堆栈跟踪。创建一个转到生产的不同模板。在您的环境中分支,例如:
set_exception_handler
答案 1 :(得分:11)
有关PHP的“回调”here的更多具体信息。要使用静态方法,回调类似于
<?php
set_exception_handler(array('MyClass','staticMethod'));
?>
要使用实例化对象中的方法,它是:
<?php
set_exception_handler(array($myObject, 'objectMethod'));
?>
要使用全局函数,它只是:
<?php
set_exception_handler('my_global_function');
?>
答案 2 :(得分:4)
从听起来的方式来看,你将使用set_exception_handler。这将保证以完全相同的方式处理所有异常。在您的应用程序中有一些地方可以使用try / catch块,例如,如果您想检查一个不一定需要以相同方式捕获的异常。
就设置set_exception_handler而言,我不确定你是否可以将该函数设置为对象的方法,除非它是静态方法。看来情况就是这样。 http://us2.php.net/set_exception_handler
有更多信息