可以使用自定义异常处理器来处理所有未捕获的异常(没有用 try/catch 捕获的异常)。
set_exception_handler():设置一个用户定义的异常处理函数,当一个未捕获的异常发生时所调用函数的名称(回调函数),该函数必须在调用
set_exception_handler() 之前已经定义。该处理函数需要接受一个参数,该参数是一个抛出的异常对象
【例】
1 <?php 2 header('content-type:text/html; charset=utf-8'); 3 header('content-type:text/html; charset=utf-8'); 4 function exceptionHandler_1($e){ 5 echo '自定义异常处理器1'; 6 echo '异常信息:'.$e->getMessage(); 7 } 8 9 function exceptionHandler_2($e){ 10 echo '自定义异常处理器2'; 11 echo '异常信息:'.$e->getMessage(); 12 } 13 14 throw new Exception('测试');
运行后输出:
出现致命错误:没有捕获到异常“Exception”。当出现未捕获的异常这种情况时,就可以使用 set_exception_hanlder() 方法:
1 <?php 2 header('content-type:text/html; charset=utf-8'); 3 header('content-type:text/html; charset=utf-8'); 4 function exceptionHandler_1($e){ 5 echo '自定义异常处理器1',__FUNCTION__,'<br>'; 6 echo '异常信息:'.$e->getMessage(); 7 } 8 9 function exceptionHandler_2($e){ 10 echo '自定义异常处理器2',__FUNCTION__,'<br>'; 11 echo '异常信息:'.$e->getMessage(); 12 } 13 14 set_exception_handler('exceptionHandler_1'); 15 throw new Exception('测试');
运行后输出:
上例中使用 自定义异常处理器1 来处理未捕获的异常。
【例2】 当定义了多个 set_exception_handler() 方法时,最后的方法会覆盖之前的方法;而使用 restore_exception_handler() 则会恢复到上一次定义过的自定义处理函数。
1 <?php 2 header('content-type:text/html; charset=utf-8'); 3 header('content-type:text/html; charset=utf-8'); 4 function exceptionHandler_1($e){ 5 echo '自定义异常处理器1',__FUNCTION__,'<br>'; 6 echo '异常信息:'.$e->getMessage(); 7 } 8 9 function exceptionHandler_2($e){ 10 echo '自定义异常处理器2',__FUNCTION__,'<br>'; 11 echo '异常信息:'.$e->getMessage(); 12 } 13 14 set_exception_handler('exceptionHandler_1'); 15 set_exception_handler('exceptionHandler_2'); 16 throw new Exception('测试');
输出:
1 <?php 2 header('content-type:text/html; charset=utf-8'); 3 header('content-type:text/html; charset=utf-8'); 4 function exceptionHandler_1($e){ 5 echo '自定义异常处理器1',__FUNCTION__,'<br>'; 6 echo '异常信息:'.$e->getMessage(); 7 } 8 9 function exceptionHandler_2($e){ 10 echo '自定义异常处理器2',__FUNCTION__,'<br>'; 11 echo '异常信息:'.$e->getMessage(); 12 } 13 14 set_exception_handler('exceptionHandler_1'); 15 set_exception_handler('exceptionHandler_2'); 16 restore_exception_handler(); 17 throw new Exception('测试');
输出:
使用自定义异常处理函数以后,程序不会继续向下执行:
1 <?php 2 header('content-type:text/html; charset=utf-8'); 3 header('content-type:text/html; charset=utf-8'); 4 function exceptionHandler_1($e){ 5 echo '自定义异常处理器1',__FUNCTION__,'<br>'; 6 echo '异常信息:'.$e->getMessage(); 7 } 8 9 function exceptionHandler_2($e){ 10 echo '自定义异常处理器2',__FUNCTION__,'<br>'; 11 echo '异常信息:'.$e->getMessage(); 12 } 13 14 set_exception_handler('exceptionHandler_1'); 15 throw new Exception('测试'); 16 17 echo 'continue...';
输出:
以上是自定义异常处理函数来处理未捕获的异常,同样也可以使用自定义异常处理类来处理未捕获的异常
1 <?php 2 class ExceptionHandler{ 3 protected $_exception; 4 protected $_logFile = 'D:/practise/php/Error/LogException2.log'; 5 public function __construct(Exception $e){ 6 //保存异常对象 7 $this->_exception = $e; 8 } 9 10 public static function handle(Exception $e){ 11 $self = new self($e); 12 $self->log(); 13 echo $self; 14 } 15 16 //记录日志方法 17 public function log(){ 18 error_log($this->_exception->getMessage().PHP_EOL, 3, $this->_logFile); 19 } 20 21 public function __toString(){ 22 $message = <<<EOF 23 <!DOCTYPE html> 24 <html lang="en"> 25 <head> 26 <meta charset="UTF-8"> 27 <title>Document</title> 28 </head> 29 <body> 30 <h1>出现异常</h1> 31 <p>请联系管理员</p> 32 </body> 33 </html> 34 EOF; 35 return $message; 36 } 37 } 38 39 40 set_exception_handler(array('ExceptionHandler', 'handle'));//处理未捕获的异常。第一个参数类名,第二个参数方法名 41 //测试 42 throw new Exception("测试自定义的异常处理器");
输出:
文件 LogException2.log: