我正在我的系统中开发一些使用php异常类的多个子类的低端代码.基本上我有几个类别的例外.我想要做的是两件事.
我需要在应用程序中触发的所有异常都在一个地方处理.
我需要能够记录然后处理/生成视图以便用户接收有关应用程序的反馈.错误.
我想知道的是我应该使用某种try/catch封装应用程序吗?我根本不喜欢这个想法,这听起来像是一个非常糟糕的实现.我也不喜欢set_exception_handler的想法,除非我可以将函数设置为对象的方法.原因是如果我指定一个函数来处理异常,那么这将是应用程序中的第一个函数.其他一切都是对象的方法.
希望我已经提供了有关该方案的足够详细信息.我正在努力保持这种清洁并遵循最佳做法.这段代码将用于OSS所以我不想写它10次:)
通过Front Controller脚本运行Web请求
set_exception_handler
尽早致电(别忘了考虑error_reporting()
).set_exception_handler
作为它的参数,php称之为"回调".你可以像这样传递一个对象方法:
// $object->methodName() will be called on errors set_exception_handler(array($object, 'methodName'));
包装您的调度代码try/catch
以捕获任何会抛出异常的代码.您的代码的catch部分将捕获所有您自己的代码的异常,以及一些本地未生成异常的php错误(例如fopen
或某些东西),这要归功于您的set_exception_handler
上述调用.php手册说明:
使用用户定义的函数无法处理以下错误类型:E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,以及调用set_error_handler()的文件中引发的大部分E_STRICT.
根据需要记录错误.
在开发中创建一个错误页面模板("视图"),该模板对Exception对象("模型")进行操作,并为您打印整个堆栈跟踪.创建一个转到生产的不同模板.在您的环境中分支,例如:
catch(Exception $e) { // log error as necessary here. if("in developement") { // $e would be available to your template at this point include "errortemplates/dev.php"; } else { include "errortemplates/prod.php"; } }
有一个关于PHP的"回调"更具体的信息在这里.要使用静态方法,回调就像
要使用实例化对象中的方法,它是:
要使用全局函数,它只是: