PHP的错误机制总结

PHP的错误机制也是非常复杂的,做了几年php,也没有仔细总结过,现在就补上这一课。

错误类型

因为错误类型整型值的巧妙设定,可以采用按位运算符

特别说明:文章的PHP版本使用5.5.32

1 E_ERROR

致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。
导致脚本终止不再继续运行
例子:调用一个未定义的函数,存在没有捕获的异常

PHP的错误级别

首先需要了解php有哪些错误。截至到php5.5,一共有16个错误级别

注意:尝试下面的代码的时候请确保打开error_log:

error_reporting(E_ALL);
ini_set('display_errors', 'On');

2 E_WARNING

运行时警告
仅给出提示信息,但是脚本不会终止运行。

E_ERROR

这种错误是致命错误,会在页面显示Fatal Error,
当出现这种错误的时候,程序就无法继续执行下去了

错误示例:

// Fatal error: Call to undefined function hpinfo() in /tmp/php/index.php on line 5
hpinfo();  //E_ERROR

注意,如果有未被捕获的异常,也是会触发这个级别的。

// Fatal error: Uncaught exception 'Exception' with message 'test exception' in /tmp/php/index.php:5 Stack trace: #0 {main} thrown in /tmp/php/index.php on line 5
throw new Exception("test exception");

4 E_PARSE

编译时语法解析错误。
解析错误仅仅由分析器产生。
register_shutdown_function不能捕获到本文件内发生的这个错误

E_WARNING

这种错误只是警告,不会终止脚本,程序还会继续进行,显示的错误信息是Warning。比如include一个不存在的文件。

//Warning: include(a.php): failed to open stream: No such file or directory in /tmp/php/index.php on line 7
//Warning: include(): Failed opening 'a.php' for inclusion (include_path='.:/usr/share/pear:/usr/share/php') in /tmp/php/index.php on line 7
include("a.php"); //E_WARNING

8 E_NOTICE

运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知
例子:使用未定义的变量

E_NOTICE

这种错误程度更为轻微一些,提示你这个地方不应该这么写。这个也是运行时错误,这个错误的代码可能在其他地方没有问题,只是在当前上下文情况下出现了问题。

比如$b变量不存在,我们把它赋值给另外一个变量

//Notice: Undefined variable: b in /tmp/php/index.php on line 9
$a = $b; //E_NOTICE

16 E_CORE_ERROR

在PHP初始化启动过程中发生的致命错误。
该错误类似 E_ERROR,但是是由PHP引擎核心产生的。

E_PARSE

这个错误是编译时候发生的,在编译期发现语法错误,不能进行语法分析。

比如下面的z没有设置为变量。

// Parse error: syntax error, unexpected '=' in /tmp/php/index.php on line 20
z=1; // E_PARSE

32 E_CORE_WARNING

PHP初始化启动过程中发生的警告
类似 E_WARNING,但是是由PHP引擎核心产生的

E_STRICT

这个错误是PHP5之后引入的,你的代码可以运行,但是不是PHP建议的写法。

比如在函数形参传递++符号

// Strict Standards: Only variables should be passed by reference in /tmp/php/index.php on line 17
function change (&$var) {
  $var += 10;
}

$var = 1;
change(++$var);
// E_STRICT

E_COMPILE_

编译相关
64 E_COMPILE_ERROR
致命编译时错误。类似E_ERROR, 但是是由Zend脚本引擎产生的。 since PHP 4
128 E_COMPILE_WARNING
编译时警告 。类似 E_WARNING,但是是由Zend脚本引擎产生的。

E_RECOVERABLE_ERROR

这个级别其实是ERROR级别的,但是它是期望被捕获的,如果没有被错误处理捕获,表现和E_ERROR是一样的。

经常出现在形参定义了类型,但调用的时候传入了错误类型。它的错误提醒也比E_ERROR的fatal
error前面多了一个Catachable的字样。

//Catchable fatal error: Argument 1 passed to testCall() must be an instance of A, instance of B given, called in /tmp/php/index.php on line 37 and defined in /tmp/php/index.php on line 33
class A {
}

class B {
}

function testCall(A $a) {
}

$b = new B();
testCall($b);

E_USER_

用户产生的
256 E_USER_ERROR
用户产生的错误信息。类似 E_ERROR, 但是是由用户自己在代码中使用PHP函数
trigger_error()来产生的。 since PHP 4
512 E_USER_WARNING
用户产生的警告信息。类似 E_WARNING, 但是是由用户自己在代码中使用PHP函数
trigger_澳门新葡亰娱乐在线,error()来产生的。 since PHP 4
1024 E_USER_NOTICE
用户产生的通知信息。类似 E_NOTICE, 但是是由用户自己在代码中使用PHP函数
trigger_error()来产生的

E_DEPRECATED

这个错误表示你用了一个旧版本的函数,而这个函数后期版本可能被禁用或者不维护了。

比如curl的CURLOPT_POSTFIELDS使用@FILENAME来上传文件的方法

// Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in /tmp/php/index.php on line 42
$ch = curl_init("http://www.remotesite.com/upload.php");
curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'. "test"));

2048 E_STRICT

启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。

E_CORE_ERROR, E_CORE_WARNING

这两个错误是由PHP的引擎产生的,在PHP初始化过程中发生。

4096 E_RECOVERABLE_ERROR

可被捕捉的致命错误。
它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。
如果该错误没有被用户自定义句柄捕获 ( set_error_handler,将成为一个
E_ERROR 从而脚本会终止运行。

E_COMPILE_ERROR, E_COMPILE_WARNING

这两个错误是由PHP引擎产生的,在编译过程中发生。

8192 E_DEPRECATED

运行时通知。
启用后将会对在未来版本中可能无法正常工作的代码给出警告。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图