php中error no register,PHP错误处理注册机制

对于PHP错误,比如语法错误,需要做到收集错误并处理,在线上也要防止被普通用户看到关键的错误信息:

博客推荐:

PHP error_log记录日志的使用方法和配置:

https://www.cnblogs.com/caicaizi/p/6812010.html

手册:

http://www.w3school.com.cn/php/php_ref_error.asp

PHP的错误跟异常区别:

https://www.cnblogs.com/taijun/p/4234603.html

学会以后需要:

主要作用:1、记录日志到指令文件2、强错误信息发送到邮箱之中

相关配置:

error_reporting ;将会向PHP报告发生的每个错误

display_errors ;不显示满足上条 指令所定义规则的所有错误报告

log_errors ;决定日志语句记录的位置

log_errors_max_len ;设置每个日志项的最大长度

error_log ;指定产生的 错误报告写入的日志文件位置

自己动手试试哦!

模拟错误 + 模拟异常 + 发送email + 线上环境对普通用户隐藏错误信息

1、PHP错误类型和相应例子:

分号缺失,致命错误。

直接注册在根命名空间的error类重名会出现致命错误,直接脚本终止,

如果在错误出现之前都没注册shutdown函数的话,直接给你一个error500,很难受

2、自己常用的错误报告处理类:

ThinkPHP的写法(方然仿照的,真实的TP5.0错误处理机制更加细分,SQL exception 还有 缓存的exception 等等统统继承基础类扩展出了一个类(虽然跟没扩展一样,但是这个OOP思想值得借鉴)):

658eed26495b1f19f29dc811f66418c17f6.jpg

自己用的简单的错误处理:

* 错误处理机制

* @author xu <435861851@qq.com>*/

classErrorCatch{/**

* 注册异常处理

* @access public

* @return void*/

public staticfunction register()

{//设定报错级别为全部

error_reporting(E_ALL);//set_error_handler — 设置用户自定义的错误处理函数

set_error_handler([__CLASS__, 'appError']);//set_exception_handler — 设置用户自定义的异常处理函数

set_exception_handler([__CLASS__, 'appException']);//register_shutdown_function — 注册一个会在php中止时执行的函数,脚本执行完成或者 exit() 后被调用

register_shutdown_function([__CLASS__, 'appShutdown']);

}/**

* 错误处理

* @access public

* @param integer $errno 错误编号

* @param integer $errstr 详细错误信息

* @param string $errfile 出错的文件

* @param integer $errline 出错行号

* @param array $errcontext 出错上下文

* @return void

* @throws ErrorException*/

public static function appError($errno, $errstr, $errfile = '', $errline = 0, $errcontext =[])

{

$msg= '错误编号: '.$errno.'';

$msg= '错误信息: '.$errstr.'';

$msg .= '文件: '.$errfile.'';

$msg .= '在第: '.$errline.' 行';

echo $msg;

exit();

}/**

* 异常处理

* @access public

* @param Exception $e 异常对象

* @return void*/

public staticfunction appException($exception)

{

echo"捕获异常:" , $exception->getMessage(), "\n";

}/**

* 异常中止处理

* @access public

* @return void*/

public staticfunction appShutdown()

{//只有错误导致的程序终止才会托管至错误处理函数

if (!is_null($error = error_get_last()) && self::isFatal($error['type'])) {

self::appException(newErrorException(

$error['type'], $error['message'], $error['file'], $error['line']

));

}

}/**

* 确定错误类型是否致命

* @access protected

* @param int $type 错误类型

* @return bool*/

protected staticfunction isFatal($type)

{returnin_array($type, [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE]);

}

}//注册自定义错误处理

ErrorCatch::register();//模拟抛出异常

trigger_error("Cannot divide by zero", E_USER_ERROR);

如果上面的trigger_error的时候后面少了一个;那么直接就是500,错误,显示服务器内部错误,

不能被shutdown函数捕获,

7dd4bc6823dd7ac112db68143e28fb399c2.jpg

49b0f89c7bff28af38db7909205d04fddb2.jpg

像这样,已经注册了函数了,就可以捕获到错误信息:

捕获异常: syntax error, unexpected end of file

一些常犯的错误及其报错信息:

<?phpforeach ([] as $k => $v)

{echo $v;

}//no any msg catch

array_merge([1,2,3],'');//Warning: array_merge(): Argument #2 is not an array in D:\webserver\www\test.php on line 8

if($a)

{echo 1;

}//Notice: Undefined variable: a in D:\webserver\www\test.php on line 13

" select * from user where id in ([])";//General error: 936 OCIStmtExecute: ORA-00936: 缺失表达式 PDO exception IN ()后面表达式不能为空不能为ARRAY

if(in_array("a", $a)){echo 1;};//Notice: Undefined variable: a in D:\webserver\www\test.php on line 24

// Warning: in_array() expects parameter 2 to be array, null given in D:\webserver\www\test.php on line 24

echo 22

//Parse error: syntax error, unexpected end of file, expecting ',' or ';' in D:\webserver\www\test.php on line 27

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值