异常和错误
示例:
$num = 0; try { echo 1/$num; } catch (exception $e){ echo $e->getmessage();//并不能执行到这里 } //说明try{}catch{}是用于捕获异常的,而错误是不能捕获到的。 //手动抛出异常进行捕获 $num = 0; try { if($num == 0){ //通过if判断可以处理错误,手动抛出异常(如何实现自动捕获错误呢,需结合三个php内置函数) throw new exception('除数为零'); } echo 1/$num; } catch (exception $e){ echo $e->getmessage(); }
什么是异常
程序在运行中出现不符合预期的情况,允许发生(你也不想让他出现不正常的情况)但他是一种不正常的情况,按照我们的正常逻辑本不该出的错误,但仍然会出现的错误,属于逻辑和业务流程的错误,而不是编译或者语法上的错误。
什么是错误
属于 php 脚本自身的问题,大部分情况是由错误的语法,服务器环境导致,使得编译器无法通过检查,甚至无法运行的情况。warning、notice 都是错误,只是他们的级别不同而已,并且错误是不能被 try-catch 捕获的
错误的分类
fatal error: 致命错误(脚本终止运行)
e_error // 致命的运行错误,错误无法恢复,暂停执行脚本
e_core_error // php 启动时初始化过程中的致命错误
e_compile_error // 编译时致命性错,就像由 zend 脚本引擎生成了一个 e_error
e_user_error // 自定义错误消息。像用 php 函数 trigger_error(错误类型设置为:e_user_error)
parse error:编译时解析错误,语法错误(脚本终止运行)
e_parse // 编译时的语法解析错误
warning error:警告错误(仅给出提示信息,脚本不终止运行)
e_warning // 运行时警告 (非致命错误)。
e_core_warning // php 初始化启动过程中发生的警告 (非致命错误) 。
e_compile_warning // 编译警告
e_user_warning // 用户产生的警告信息
notice error:通知错误(仅给出通知信息,脚本不终止运行)
e_notice // 运行时通知。表示脚本遇到可能会表现为错误的情况.
e_user_notice // 用户产生的通知信息。
5 类是产生 error 级别的错误,这种错误直接导致 php 程序退出。分别是 error = e_error | e_core_error | e_compile_error | e_user_error | e_parse
如何实现捕获错误
实现用 try {} catch (exception $e){} 捕获异常的方式,来捕获错误,需借助三个函数
// 注册一个会在php中止时执行的函数 register_shutdown_function('myshutdownfunction'); function myshutdownfunction() { if ($error = error_get_last()) { var_dump('<b>register_shutdown_function: type:' . $error['type'] . ' msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>'); } }
//注册异常处理函数, 没有捕获处理的异常,将统一再这里处理 set_exception_handler('myexception'); function myexception($exception) { var_dump("<b>set_exception_handler: exception: " . $exception->getmessage() . '</b>'); }
//注册错误处理函数 set_error_handler('myerror'); function myerror($type, $message, $file, $line) { //var_dump('<b>set_error_handler: ' . $type . ':' . $message . ' in ' . $file . ' on ' . $line . ' line .</b><br />'); throw new exception($message); }
捕获所有错误的原理
由 set_error_handler () 可知,他能够捕获一部分错误,不能捕获系统级 e_error、e_parse 等错误,但是这部分可以由 register_shutdown_function () 捕获。所以两者结合能出现很好的功能。
小结
三个函数实现自动捕获异常和错误
set_error_handler () 只能够捕获部分错误
register_shutdown_function () 结合 set_error_handler () 函数,能捕获所有错误
set_exception_handler () 用于捕获异常
error_get_last () 最后终止错误信息
在捕获错误的函数中,再手动抛出异常,即实现 set_exception_handler 能够捕获错误。
推荐教程:《php视频教程》
以上就是直击php的异常和错误处理的详细内容。