通用异常处理程序
当异常与try/catch块中的代码结合使用时,异常特别有用。然而,在某些情况下,使用这种结构可能会很笨拙,使代码几乎不可读。另一个考虑因素是,许多类最终会抛出你没有预料到的异常。在这种情况下,有某种回退异常处理程序是非常可取的。
如何做...
1.首先,我们定义一个通用的异常处理类,Application\Error\Handler。
namespace Application\Error;
class Handler
{
// code goes here
}2. 我们定义了代表一个日志文件的属性。如果没有提供名称,则以年、月、日命名。在构造函数中,我们使用set_exception_handler()来分配exceptionHandler()方法(在这个类中)作为后备处理程序。
protected $logFile;
public function __construct(
$logFileDir = NULL, $logFile = NULL)
{
$logFile = $logFile ?? date('Ymd') . '.log';
$logFileDir = $logFileDir ?? __DIR__;
$this->logFile = $logFileDir . '/' . $logFile;
$this->logFile = str_replace('//', '/', $this->logFile);
set_exception_handler([$this,'exceptionHandler']);
}3. 接下来,我们定义exceptionHandler()方法,它以一个Exception对象作为参数。我们在日志文件中记录了日期和时间、异常的类名以及它的消息。
4. 如果我们在代码中专门放置了try/catch块,这将覆盖我们的通用异常处理程序。另一方面,如果我们不使用try/catch,而发生了异常,通用异常处理程序就会发挥作用。
如何运行...
首先,将前面配方中的代码放入Application\Error文件夹中的Handler.php文件。接下来,定义一个测试类来抛出异常。为了说明问题,创建一个Application\Error\ThrowsException类来抛出一个异常。作为一个例子,设置一个PDO实例,错误模式设置为PDO::ERRMODE_EXCEPTION。然后,你可以制作一个保证失败的SQL语句。
接下来,定义一个名为chap_13_exception_handler.php的调用程序,设置自动加载,使用相应的类。
此时,如果你在没有实现通用处理程序的情况下创建一个ThrowsException实例,就会产生一个Fatal Error,因为一个异常已经被抛出但没有被捕获。

另一方面,如果你使用try/catch块,如果你的应用程序足够稳定,那么异常就会被捕获并允许继续。
您将看到以下输出。

为了演示异常处理程序的使用,在try/catch 块之前,定义一个 Handler 实例,传递一个代表包含日志文件的目录的参数。在 try/catch 块之后,在该块之外,创建另一个 ThrowsException 实例。当你运行这个示例程序时,你会注意到第一个异常是在try/catch块内捕获的,而第二个异常是由处理程序捕获的。你还会注意到,在处理程序之后,应用程序结束。
下面是完成的示例程序的输出,以及日志文件的内容。

更多...
也许你可以回顾一下set_exception_handler()函数的文档。特别是看一下匿名者的评论(7年前发布的,但仍然是相关的),它澄清了这个函数的工作原理:http://php.net/manual/en/function.set-exception-handler.php。
最后更新于