【PHP】解析PHP中的错误和异常处理
目录结构:
在这篇文章中,笔者将会阐述PHP中的异常处理,希望能够对你有所帮助。
1.错误级别
PHP5中定义了16种不同的错误级别,下面仅仅粘贴其中几种。
级别常量 | 错误值 | 错误报告描述 |
E_ERROR | 1 | 致命的运行时错误(阻止脚本执行) |
E_WARNING | 2 | 运行时警告(非致命性错误) |
E_PARSE | 4 | 从语法中解析错误 |
E_NOTICE | 8 | 运行时注意消息(可能是或可能不是一个问题) |
E_CORE_ERROR | 16 | PHP启动时初始化过程中的致命错误 |
E_CORE_WARNING | 32 | PHP启动时初始化过程中的警告(非致命性错) |
E_COMPILE_ERROR | 64 | 编译时致命性错 |
E_COMPILE_WARNING | 128 | 编译时警告(非致命性错) |
E_USER_ERROR | 256 | 用户自定义的致命错误 |
E_USER_WARNING | 512 | 用户自定义的警告(非致命性错误) |
E_USER_NOTICE | 1024 | 用户自定义的提醒 |
E_STRICT | 2048 | 编码标准化警告(建议如何修改以向前兼容) |
E_ALL | 32767 |
所有的错误、警告和注意信息,在PHP5.4.0之前的版本之前不包含E_STRICT错误级别。 注意:在PHP 5.4.x 中是32767,在PHP 5.3.x中是30719,在 PHP 5.2.x中是6143,在5.2.x之前的版本是2047。 |
在知道了这些错误级别后,我们开始调整错误报告级别,既可以通过修改PHP配置文件,也可以通过修改PHP脚本代码来实现。
先介绍如何通过修改PHP配置文件来实现,在PHP的配置文件(php.ini)中,display_errors直接控制PHP是否输出错误、提醒和警告信息。它的值有On、Off、stdout、stderr:
On 或 stdout:表示输出所有消息到标准的输出流。
stderr:表示输出所有消息到标准的错误流。
Off:表示不显示任何消息。
还可以通过PHP脚本代码来修改php.ini配置文件,通过ini_set(...)函数可以实现这个功能,
比如修改php.ini配置文件中的display_errors属性的话,可以通过:
ini_set("display_errors","On");
这里是将所有的消息都输出到标准输出流。
例如:
<html>
<head>
<title>display_errors</title>
</head>
<body>
<?php
//ini_set("display_errors","Off");
echo "-------------------------------------<br/>";
gettype();//抛出警告信息
echo "-------------------------------------<br/>";
?>
</body>
</html>
效果图:
给ini_set("display_errors","Off");取消注释后,会看到如下效果:
通过手动修改PHP配置文件和ini_set函数,都可以达到这个功能,然而手动修改PHP配置文件的项目可移植性不强,推荐通过ini_set函数来实现。
display_errors相当于总开关,要么开启所有错误消息输出,要么关闭所有的错误消息输出。那么有没有能够控制报告不同级别的错误设置呢?PHP提供的error_reporting()函数就可以动态完成设置错误报告级别。如:error_reporting(E_ALL);
例如:
<html>
<head>
<title>display_errors</title>
</head>
<body>
<?php
error_reporting(E_ALL);//报告所有错误
echo "-------------------------------------<br/>";
gettype();
echo "-------------------------------------<br/>";
?>
</body>
</html>
效果与ini_set("display_errors","On");一样。
error_reporting()可以设置16中错误级别中的任何一种,强烈建议在设置的时候通过常量名来设置,在未来的版本中才能保证移植性。
error_reporting()也可以接受位标志,例如:
error_reporting(E_ERROR | E_WARNING);
2.自定义处理器
通过上面的案例我们可以看到,所有抛出的错误都是在错误代码处抛出的,这是标准的PHP错误处理函数。
然而PHP允许程序员自定义错误和异常处理器,能够完全绕过PHP标准的错误和异常处理函数,这样的话,就可以自定义错误和异常的处理方式。
mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )
自定义的错误处理器,当有错误发生时,会调用该处理器设置的异常。
callable set_exception_handler ( callable $exception_handler )
自定义的异常处理器,当有未捕获的异常抛出时候,该函数设置的处理器就会处理该异常。
restore_exception_handler()
当使用set_exception_handler设置过自定义异常处理器后,restore_exception_handler可以恢复到之前的那个异常处理器。
restore_error_handler()
当使用set_error_handler设置过自定义错误处理器后,restore_error_handler可以恢复到之前的那个错误处理器。
3.设置异常日志
如果要设置异常日志的话,那么就要修改PHP配置文件php.ini。
error_reporting = E_ALL//将向PHP发送每个错误
display_errors=Off //不显示错误报告
log_errors=On //开启日志记录
log_errors_max_log=1024// 每个日志项的最大长度
error_log="c:/myerror.log" //指定错误写进的文件
在php文件中使用error_log()来记录日志,就可以将信息写入到myerror.log文件中。
比如:
error_log("unexpected error");
error_log不仅可以指定日志的记录文件,还可以将日志输出到操作系统中,只要将error_log指定为syslog就可以了(Win 95不支持)。
4.自定义异常类
一个自定义的异常类必须从Exception派生,Exception类的元数据如下:
Exception implements Throwable {
/* Properties */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* Methods */
public __construct ([ string $message = "" [, int $code = 0 [, Throwable $previous = NULL ]]] )
final public string getMessage ( void )
final public Throwable getPrevious ( void )
final public mixed getCode ( void )
final public string getFile ( void )
final public int getLine ( void )
final public array getTrace ( void )
final public string getTraceAsString ( void )
public string __toString ( void )
final private void __clone ( void )
}
其中__construct表示构造方法,可以按照需要重写它的构造方法和__toString()方法。
例如:
<?php
/* 自定义的一个异常处理类,但必须是扩展内异常处理类的子类 */
class MyCustomException extends Exception{
//重定义构造器使第一个参数 message 变为必须被指定的属性
public function __construct($message, $code=0){
//可以在这里定义一些自己的代码
//建议同时调用 parent::construct()来检查所有的变量是否已被赋值
parent::__construct($message, $code);
}
public function __toString() {
//重写父类方法,自定义字符串输出的样式
return __CLASS__.":[".$this->code."]:".$this->message."<br>";
}
public function customFunction() {
//为这个异常自定义一个处理方法
echo "按自定义的方法处理出现的这个类型的异常<br>";
}
} try{
throw new MyCustomException("Unexpected Exception");
}catch(MyCustomException $e){
echo $e; $e->customFunction();
}
echo "<br/>";
echo "end";
?>
【PHP】解析PHP中的错误和异常处理的更多相关文章
- Yii中的错误及异常处理
Yii中的错误及异常处理 Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler, set_error_handler实现的. ...
- [erlang 001] erlang中的错误及异常处理
一. erlang中的错误 1. 分类 1) 编译错误:主要是编译器检测出的代码语法错误: 2) 逻辑错误:是指程序没有完成预期的工作,属于开发人员的问题: 3) 运行时错误:是指erlang运行时抛 ...
- 经常出现在python中的错误和异常处理
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://t.cn/A6Zvjdun 使用try except处理异常 上面的代码中,被除数是0,会引发ZeroDivisio ...
- Golang错误和异常处理的正确姿势
Golang错误和异常处理的正确姿势 错误和异常是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从 ...
- PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别)
PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别) 一.总结 一句话总结: throwable接口+Error类 在PHP7更新中有一条:更多的Error变为可捕获的Exce ...
- PHP中的错误处理、异常处理机制详解
在编写PHP程序时,错误处理是一个重要的部分.如果程序中缺少错误检测代码,那么看上去很不专业,也为安全风险敞开了大门 例: <?php $a = fopen('test.txt','r'); / ...
- EBS OAF开发中的错误/异常处理(ErrorHandling) (转)
原文地址 EBS OAF开发中的错误/异常处理(ErrorHandling) EBS OAF开发中的错误/异常处理(ErrorHandling) (版权声明,本人原创或者翻译的文章如需转载,如转载用于 ...
- idea中Hibernate错误:无法解析表
idea中Hibernate错误:无法解析表 这种情况主要是在idea中使用hibernate自定义注解,idea无法检查数据源 this inspecton controls whether the ...
- 再谈PHP错误与异常处理
博客好久没有更新了,实在惭愧,最近在忙人生大事,哈哈!这段时间没有看什么新的东西,结合项目中遇到的PHP异常处理问题,我又重新梳理了之前模糊的概念,希望对大家理解PHP异常处理有所帮助. 请一定要注意 ...
随机推荐
- 20165220 Java第五周学习总结
教材学习内容总结 1.try—catch语句:Java用try—catch语句来处理异常.将可能出现的异常操作放在try中,当try出现异常时,此部分立刻结束运行,转向执行catch部分.一个try- ...
- Python语言说明
第一章:Python入门一.语言什么是语言:人与人之间的沟通计算机语言:计算机语言,即人和计算机之间的沟通语言. 按照级别分类:机器语言:最底层,最低级的语言,只能识别0/1,电平信号汇编语言:计算机 ...
- 从小白到区块链工程师:第一阶段:Go语言的HelloWorld初始(2)
四.写下第一段Go语言代码“Hello World” 小建议:就是文件夹路径或者文件名称不要出现中文,可能会导致一些不必要的麻烦(编译失败) 在sublime中,我们在src文件夹上面,单击右键“Ne ...
- 如何删除pagefile.sys
经常使用电脑的用户就会发现系统自带了虚拟内存文件pagefile.sys,若是电脑出现内存不足情况,其就会调用虚拟内存来执行程序,以防止系统内存崩溃.不过,虚拟内存没有真实的内存读取速度快,而且会占用 ...
- SpringBoot使用AOP
本文介绍SpringBoot中使用Spring AOP. 简介 AOP简介 AOP可能对于广大开发者耳熟能详,它是Aspect Oriented Programming的缩写,翻译成中文就是:面向切面 ...
- 伪类实现特殊图形,一个span加三角形
题目如图: 实现思路: 伪类+三边透明的三角形实现 代码: <span class="wei">wei</span> .wei{ display: inli ...
- F5-VM
如果找不到的话,点击下面的链接.链接包含物理主机镜像和虚机主机镜像,选择virtual Edition. BIG-IP v11.x / Virtual Edition https://download ...
- Nodejs连接mysql的增、删、改、查操作
一,创建数据库 Source Database : my_news_test SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- ...
- TFS Release 步骤调用命令行返回失败信息的处理方法
TFS Release中自定义步骤时,可以选择“命令行”,官方的文档中,并没有描述调用相关的程序后,如何返回失败信息.通过下面步骤,可以实现本标题描述的功能. 步骤一:编写Console Applic ...
- PAT Basic 1001
1001 害死人不偿命的(3n+1)猜想 (15 分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复 ...