标题: PHP Fatal error 的捕获,或者说善后

时间: 2014-01-11 15:25:18

正文:

说 PHP 是针对 web 设计的,有很多细节可以看出来。其中一个是, PHP 有几种类型的 fatal error , 比如语法错误,可以理解为编译型错误;又如函数未定义这样的是运行时错误。fatal error 会直接导致程序终止运行,而不能像异常那样被捕获,并在程序中做相关的处理后继续执行。一般来说,可以通过 register_shutdown_function 的机制来实现出现运行时 fatal error 的后续处理,但是严格来说不是像异常那样的捕获,只可以说是苟延残喘,只是在程序发生 fatal error 之后执行特定的逻辑,不能阻止程序的终止。另外编译型错误是无法被处理的。

附注: 一般的 warning/notice 等错误可以通过 set_error_handler 来自定义处理规则,但是不能处理 fatal error.

        转载请注明出处 http://blog.hickwu.com/posts/316 by Hick

下面是范例:

<?php

register_shutdown_function( "fatal_handler" );

function fatal_handler() {
  $errfile = "unknown file";
  $errstr  = "shutdown";
  $errno   = E_CORE_ERROR;
  $errline = 0;

  $error = error_get_last();

  if( $error !== NULL) {
    $errno   = $error["type"];
    $errfile = $error["file"];
    $errline = $error["line"];
    $errstr  = $error["message"];
  }

  echo format_error( $errno, $errstr, $errfile, $errline ) ;
}

function format_error( $errno, $errstr, $errfile, $errline ) {
  $trace = print_r( debug_backtrace( false ), true );

  $content  = "<table><thead bgcolor='#c8c8c8'><th>Item</th><th>Description</th></thead><tbody>";
  $content .= "<tr valign='top'><td><b>Error</b></td><td><pre>$errstr</pre></td></tr>";
  $content .= "<tr valign='top'><td><b>Errno</b></td><td><pre>$errno</pre></td></tr>";
  $content .= "<tr valign='top'><td><b>File</b></td><td>$errfile</td></tr>";
  $content .= "<tr valign='top'><td><b>Line</b></td><td>$errline</td></tr>";
  $content .= "<tr valign='top'><td><b>Trace</b></td><td><pre>$trace</pre></td></tr>";
  $content .= '</tbody></table>';

  return $content;
}


$arr = arry(1111);

相关连接 How do I catch a PHP Fatal Error

查看更多文章
分享到:


分享到: