PHP 笔记——错误处理
本帖最后由 He110 于 2016-12-10 11:19 编辑我说评分的能看清楚吗。。。不是搞安全的,还有然并卵的,我逼你看了?
依旧是屎一样的排版,推荐在文末下载 Markdown 文档观看,观看本文建议先观看其他笔记——PHP 环境配置、PHP 基础、PHP 数组、面向对象基础、命名空间、字符串、正则表达式
PHP 错误类型
[*]语法错误: 通常发生在程序开发时, 可以通过错误报告修复
[*]运行时的错误: 通常程序会继续运行, 但是会显示一条错误信息, 并且某个函数没有成功执行
[*]逻辑错误: 不会提示错误, 程序也能正常执行, 但是不能返回正常结果
错误报告级别
[*]E_ERROR: 致命错误, 会阻止脚本执行
[*]E_WARNING: 运行时的警告, 非致命错误
[*]E_PARSE: 语法解析错误
[*]E_NOTICE: 运行时注意的消息, 可能是错误也可能不是
[*]E_CODE_ERROR: 类似于 E_ERROR, 但不包含 PHP 核心造成的错误
[*]E_CODE_WARNING: 类似于 E_WARNING, 但是不包含 PHP 核心造成的警告
[*]E_COMPILE_ERROR: 致命的编译错误
[*]E_COMPILE_WARNING: 致命的编译警告
[*]E_USER_ERROR: 用户导致的错误
[*]E_USER_WARNIGN: 用户导致的警告
[*]E_USER_NOTICE: 用户导致的注意消息
[*]E_ALL: 所有错误、警告、注意
[*]E_STRICT: 关于 PHP 版本移植的兼容性和互操作性建议
调整错误报告级别
[*]全局设置: 在配置文件 php.ini 中修改 error_reporting 的值, 修改后重启 WEB 服务器即可, 此设置会应用于所有的 PHP 文件, 如:
; 可以抛出任意非 notice 的错误error_reporting=E_ALL & ~E_NOTICE
; 只抛出运行时的致命错误、解析错误、核心错误error_reporting=E_ERROR|E_PARSE|E_CODE_ERROR
; 抛出除用户造成的错误之外的错误error_reporting=E_ALL & ~(E_USER_ERROR|E_USER_NOTICE|E_USER_WARNIGN)
[*]临时设置: 在需要设置错误报告级别的 PHP 文件中使用 error_reporting() 函数, 如:
error_reporting(0); // 不抛出任何错误error_reporting(E_ALL); // 抛出所有错误error_reporting(E_ALL&~E_NOTICE) // 抛出非 NOTICE 的错误
[*]PHP 错误报告配置指令
display_startup_errors: 是否显示 PHP 引擎初始化时遇到的错误, 默认为 Offlog_errors: 确定日志语句记录的位置, 默认为 Offerror_log: 设置错误可以发送到 syslog 中, 默认为 Nulllog_errors_max_len: 每个日志项的最大长度, 以字节为单位, 设置为 0 表示指定最大长度, 默认为 1024ignore_repeated_errors: 是否忽略同一文件、同一行发生的重复错误, 默认为 Offignore_repeated_source: 忽略不同文件中或同一文件中不同行发生的重复错误, 默认为 Offtrack_errors: 启用后会在 $php_errormsg 中存储最近发生的错误信息
自定义错误
使用 trigger_error() 函数可以代替 die(), 使用该函数能生成一个用户警告来代替 die() 输出的错误信息, 例如:
trigger_error("没有找到该文件", E_USER_ERROR);
自定义错误处理
使用自定义错误处理的情况:
[*]记下错误信息, 及时发现问题
[*]屏蔽错误
[*]做相应的处理, 将所有的错误放在脚本最后一起输出, 或出错时跳转到预先定义好的错误页面, 如果必要, 还能终止脚本运行
[*]作为调试工具, 用于不影响正在使用的用户时的调试
通常使用 set_error_handler() 函数设置用户自定义的错误处理函数, 用于创建在程序运行时, 使用用户自己的错误处理方法, 返回旧的错误处理程序;若失败, 返回 null。
注意:
[*]E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING 这些错误是不会被捕获的, 会用最原始的方式显示出来
[*]使用了 set_error_handler 函数后, error_reporting 函数就失效了, 除上述错误外所有的错误都交给用户自己处理
错误日志
当产品上线时, 需要第一时间将 display_errors 关闭, 避免暴露路径、数据库链接、数据库表等重要信息, 这时就需要记录错误报告了, 可以直接在 PHP 的配置文件中开启 log_errors 即可, 默认会将错误报告记录到 WEB 服务器的日志文件里
使用指定文件记录错误日志
指定文件记录错误日志一定要确保错误日志保存在根目录之外, 避免被攻击, 并且需要让 WEB 服务有写权限, 并对 PHP 配置文件做如下修改:
error_reporting = E_ALLdisplay_errors = Offlog_errors = Onlog_errors_max_len = 1024; 指定错误日志存放的文件夹error_log = D:/Logs/error.log使用错误日志记录自定义错误的方法见例程
将错误信息记录到操作系统的日志中
Unix/Linux 系统的日志使用的是 syslog, 而 Windows 也和 Unix/Linux 相似, 只是在 Windows 中使用事件查看器查看。需要将消息发送到操作系统日志, 只需对 PHP 配置文件做如下修改:
error_reporting = E_ALLdisplay_errors = Offlog_errors = Onlog_errors_max_len = 1024error_log = syslog向 syslog 发送自定义消息
define_syslog_variables(): 在使用 openlog()、syslog()、closelog() 之前必须先调用该函数为他们初始化变量openlog(): 打开日志器的连接, 为发送消息做准备, 并将提供的第一个字符串参数插入到每个日志消息中syslog(): 向系统日志发送一条自定义消息, 第一个参数设置消息优先级, 如: LOG_WARNING、LOG_EMERG 等, 第二个参数时消息字符串closelog(): 关闭日志连接
异常处理
使用 try-catch 语句实现异常处理, 使用 throw 语句抛出异常, 在 PHP 中必须手动抛出异常, 不像 JAVA 可以自动抛出异常。抛出异常时使用 throw 关键字, 如果 throw 语句被执行, 则其后的代码都不执行, 而是转到 catch 中的代码执行, 这样程序就不会崩溃, 可以继续执行
try { ...} catch(Exception $e) { ...}扩展 PHP 异常处理类
PHP 可扩展的属性和方法如下:
class Exception { // 异常信息 protected $message = "Unknown exception"; // 用户自定义异常代码 protected $code = 0; // 发生异常的文件名 protected $file; // 发生异常的代码行号 protected $line; function __construct($message=null, $code=0) {} // 获取异常信息 final function getMessage() {} // 获取异常代码 final function getCode() {} // 获取发生异常的文件名 final function getFile() {} // 获取发生异常的行号 final function getLine() {} // backtrace() 数组 final function getTrace() {} // 格式化为字符串的 getTrace() 函数 final function getTraceAsString() {} // 可重载的方法, 可输出的字符串 function __toString() {}}
捕获多个异常
可能发生多个异常, 并且每个异常的处理方式都不一样时, 可以使用多个 catch 语句进行处理, 当 try 代码块不再抛出异常或者找不到可以匹配的 catch 语句时, PHP 会跳转到最后一个 catch 语句执行。多个 catch 语句时, 每个 catch 语句捕获的异常必须不同
Markdown 文档下载:链接: http://pan.baidu.com/s/1hsfro0k 密码: wnnt实例链接:链接: http://pan.baidu.com/s/1pL4LIrT 密码: jhun
链接掉了请私信
复制粘贴把.. 虽然我做PHP半年多了,还是对这些概念不清楚,简单的函数都要百度,我想说的是这些,学php时候都学过,现在都忘完了, 很受用哈 谢谢分享 活捉php开发者一枚 Jr丶新一 发表于 2016-12-10 10:04
复制粘贴把..
复制Markdown的排版啊。。。zz 多谢分享 菊花帅比 发表于 2016-12-10 11:07
活捉php开发者一枚
PHP 是最好的语言,手动滑稽{:301_997:}
页:
[1]