风之旅人 Android Dev Engineer

6.PHP错误处理

2019-10-11
PHP

错误处理

错误处理

指的是系统(或者用户)在对某些代码进行执行的时候,发现有错误, 就会通过错误处理的形式告知程序员。

错误分类

  1. 语法错误:用户书写的代码不符合PHP的语法规范,语法错误会导致代码在编译过程中不通过, 所以代码不会执行(Parse error)
  2. 运行时错误:代码编译通过,但是代码在执行的过程中会出现一些条件不满足导致的错误(runtime error)
  3. 逻辑错误:程序员在写代码的时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但是得不到想要的结果
$a = 10;
If($a = 1){		//最常见把比较符号写成赋值符号
	//执行代码
}

错误代号

所有看到的错误代号在PHP中都被定义成了系统常量(可以直接使用)

  1. 系统错误:
    E_PARSE编译错误代码不会执行
    E_ERRORfatal error致命错误会导致代码不能正确继续执行出错的位置断掉
    E_WARNINGwarning警告错误不会影响代码执行但是可能得到意想不到的结果
    E_NOTICEnotice通知错误不会影响代码执行
    
  2. 用户错误:E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE 用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到)
  3. 其他:E_ALL,代表着所有从错误(通常在进行错误控制的时候使用比较多), 建议在开发过程中(开发环境)使用
    所有以E开头的错误常量代号其实都是由一个字节存储然后每一种错误占据一个对应的位如果想进行一些错误的控制可以使用位运算进行操作
    排除通知级别noticeE_ALL & ~E_NOTICE
    只要警告和通知E_WARNING | E_NOTICE
    

错误触发

  • 程序运行时触发:系统自动根据错误发生后,对比对应的错误信息,输出给用户:主要针对代码的语法错误和运行时错误。
  • 人为触发:知道某些逻辑可能会出错,从而使用对应的判断代码来触发响应的错误提示

  • trigger_error(错误提示):可以通过第二个参数进行严格性控制
//PHP错误处理

//处理脚本让浏览器按照指定字符集解析的方法 ✨ 处理中文乱码问题
header('Content-type:text/html;charset=utf-8');

//除法运算
$b = 0;

if($b == 0){
	//人为触发错误
	trigger_error('除数不能为0!');					     //默认 notice,会继续执行
	trigger_error('除数不能为0!',E_USER_ERROR); //默认 error,代码不会执行
}

echo 'hello ';

错误显示设置

错误显示设置:哪些错误该显示,以及该如何显示 ; 在PHP中,其实有两种方式来设置当前脚本的错误处理

# PHP的配置文件:全局配置:php.ini文件
display_errors :是否显示错误
error_reporting :显示什么级别的错误
# 默认配置
error_reporting = E_ALL
display_errors = On
2、	可以在运行的PHP脚本中去设置:在脚本中定义的配置项级别比配置文件高(通常在开发当中都会在代码中去进行控制和配置.
Error_reporting():设置对应的错误显示级别
Ini_set(‘配置文件中的配置项’,配置值)
Ini_set(‘error_reporting’,E_ALL);
Ini_set(‘display_errors’,1);

错误日志设置

在实际生产环境中,不会直接让错误赤裸裸的展示给用户:
1、	不友好
2、	不安全:错误会暴露网站很多信息(路径、文件名.

所以在生产环境中,一般不显示错误(错误也比较少),但是不可能避免会出现错误(测试的时候不会发现所有的问题),这个时候不希望看到,但是又希望捕捉到可以让后台程序员去修改:需要保存到日志文件中,需要在PHP配置文件中或者代码中(ini_set)设置对应error_log配置项

1、 开启日志功能

; Besides displaying errors, PHP can also log errors to locations such as a
; server-specific log, STDERR, or a location specified by the error_log
; directive found below. While errors should not be displayed on productions
; servers they should still be monitored and logging is a great way to do that.
; Default Value: Off
; Development Value: On
; Production Value: On
; http://php.net/log-errors
log_errors = On

2、指定路径

;windows.show_crt_warning

自定义错误处理

最简单的错误处理:trigger_errors()函数,但是该函数不会阻止系统报错

PHP系统提供了一种用户处理错误的机制:用户自定义错误处理函数,然后将该函数增加操系统错误处理的句柄中,然后系统会在碰到错误之后,使用用户定义的错误函数。
  1. 如何将用户自定义的函数放到系统中?

set_error_handler()

mixed set_error_handler( callable $error_handler[, int $error_types = E_ALL | E_STRICT] )

设置一个用户的函数(error_handler)来处理脚本中出现的错误


$error_handle 👉 回调函数:用户自定义的函数

  1. 自定义错误处理函数,系统有要求

对应代码实现:

  1. 自定义错误处理函数:注意参数
//自定义错误处理机制
header('Content-type:text/html;charset=utf-8');

//自定义函数
/*
	@param1 $errno,是系统提供的错误代码:E_ALL,E_NOTICE..
*/
function my_error($errno,$errstr,$errfile,$errline){
	//判断:当前会碰到错误有哪些 👉 排除系统本事就要排除的错误
	if(!(error_reporting() & $errno)){
		return false;
		//error_reporting没有参数代表获取当前系统错误处理对应的级别
	}

	//开始判断错误类型 👉 匹配错误
	switch($errno){
		case E_ERROR:
		case E_USER_ERROR:
			echo 'fatal error in file ' . $errfile . ' on line ' . $errline . '<br/>';
			echo 'error info :' . $errstr;
			break;
		case E_WARNING:
		case E_USER_WARNING:
			echo 'Warning in file ' . $errfile . ' on line ' . $errline . '<br/>';
			echo 'error info :' . $errstr;
			break;
		case E_NOTICE:
		case E_USER_NOTICE:
			echo 'Notice in file ' . $errfile . ' on line ' . $errline . '<br/>';
			echo 'error info :' . $errstr;
			break;
	}

	return true;
}

//报错
echo $a;  👉 原来系统报错

//修改错误机制
set_error_handler('my_error');

echo $a;  👉 修改错误机制后,使用自定义报错

🍎

Notice: Undefined variable: a in C:\fastwork\Apache24\htdocs\test.php on line 40
Notice in file C:\fastwork\Apache24\htdocs\test.php on line 45
error info Undefined variable: a
  1. 注册自定义函数:修改错误处理机制
    Notice: Undefined variable: a in C:\fastwork\Apache24\htdocs\test.php on line 40
    Notice in file C:\fastwork\Apache24\htdocs\test.php on line 45
    error info Undefined variable: a
    

    当前属于简单自定义模式,如果要复杂,可以在某些影响代码功能的错误发生后,让用户跳转到某个指定界面。



相关文章

上一篇 5.PHP函数

下一篇 7.PHP字符串

评论