吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3308|回复: 7
收起左侧

[其他转载] PHP 笔记——错误处理

[复制链接]
He110 发表于 2016-12-10 09:29
本帖最后由 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
链接掉了请私信


免费评分

参与人数 5热心值 +5 收起 理由
若溪风 + 1 谢谢@Thanks!
酱爆你个西瓜头 + 1 喷子颇多,楼主加油!
aaabbbccc + 1 热心回复!
JIESHAO??? + 1 谢谢@Thanks!
赵文起 + 1 然并卵

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Jr丶新一 发表于 2016-12-10 10:04
复制粘贴把..
赵文起 发表于 2016-12-10 10:31
虽然我做PHP半年多了,还是对这些概念不清楚,简单的函数都要百度,我想说的是这些,学php时候都学过,现在都忘完了,
夜雪暮歌 发表于 2016-12-10 11:04
菊花帅比 发表于 2016-12-10 11:07
活捉php开发者一枚
 楼主| He110 发表于 2016-12-10 11:18

复制Markdown的排版啊。。。zz
JIESHAO??? 发表于 2016-12-10 11:39
多谢分享
 楼主| He110 发表于 2016-12-10 14:31

PHP 是最好的语言,手动滑稽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 11:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表