#参考# PHP 异常处理(菜鸟教程),PHP 错误处理(菜鸟教程)
Exception
Exception说明:Exception是所有异常的基类。
Exception类摘要
Exception {
/* 属性 */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* 方法 */
public __construct ([ string $message
= "" [, int $code
= 0 [, Throwable $previous
= NULL
]]] )
final public getMessage ( void ) : string
final public getPrevious ( void ) : Throwable
final public getCode ( void ) : int
final public getFile ( void ) : string
final public getLine ( void ) : int
final public getTrace ( void ) : array
final public getTraceAsString ( void ) : string
public __toString ( void ) : string
final private __clone ( void ) : void
}
属性
message:异常消息内容
code:异常代码
file:抛出异常的文件名
line:抛出异常在该文件中的行号
Table of Contents
- Exception::__construct — 异常构造函数
- Exception::getMessage — 获取异常消息内容
- Exception::getPrevious — 返回异常链中的前一个异常
- Exception::getCode — 获取异常代码
- Exception::getFile — 创建异常时的程序文件名称
- Exception::getLine — 获取创建的异常所在文件中的行号
- Exception::getTrace — 获取异常追踪信息
- Exception::getTraceAsString — 获取字符串类型的异常追踪信息
- Exception::__toString — 将异常对象转换为字符串
- Exception::__clone — 异常克隆
1.PHP异常机制
①异常定义:异常exception是面向对象中一种错误捕捉机制.它允许开发人员将可能出现的错误被对象exception类捕捉,然后在特定位置通过该对象来进行处理.如:
$res=4/0;
上述代码在编译时不存在问题.但是在运行的时候因为除数为0,所以会出现错误.而这个时候默认的,就是系统无法正确执行,立马给出错误(php默认的规则).这种错误直接给出的方式不属于异常捕捉,异常捕捉需要用到异常类exception类进行捕捉:使用throw
很明显,使用面向对象的方式会额外增加代码来实现错误处理.但是在面向对象中,异常机制通常很成熟,并不需要写额外很多代码,而且绝大部分时间里,我们并不会去处理"不可能"出现问题的代码.
②面向对象异常处理机制:如果代码有可能出现未知错误(通常是因为外部数据的不确定性),我们可以将代码块放到一个会自动捕获错误的代码块中来实现异常的处理.异常捕捉语法如下:
③上述代码程序自己并没有捕获到错误(还是php系统自动处理错误),原因是系统默认使用的警告模式,即有任何问题都是直接报错.如果要实现异常处理必须借助于系统提供的set_error_handler(回调函数)来告知系统我们想采用的处理模式
程序运行结果如下:
④.处理错误有两种模式:有try和无try
⑤exception类异常对象$e到现在为止没有产生任何作用.其实exception类有很多方法和属性,可以帮助我们捕获错误信息
具体使用如下
⑥有时候代码如果走到"死胡同",即代码执行没有任何问题,但是不符合我们逻辑.以前我们是跳转提示,现在可以抛出异常,交给异常来处理:throw new exception();
总结
2.PDO错误机制
定义:PDO错误机制,是指PDO在使用过程中出现了错误(大多是sql指令执行错误)的时候,PDO处理错误的方式
PDO提供了3种错误机制,是通过PDO常量PDO::ATTR_ERRMODE来选择的
- PDO::ERRMODE_SILENT:静默模式,出错了不处理(默认)
- PDO::ERRMODE_WARNING:警告模式,出错了给出错误提示
- PDO::ERRMODE-EXCEPTION:异常模式,出错了将错误交给异常PDOException对象
PDO::setAttribute ( int $attribute
, mixed $value
) : bool
设置数据库句柄属性。下面列出了一些可用的通用属性。
PDO::ATTR_ERRMODE:错误报告。
-
PDO::ERRMODE_SILENT: 仅设置错误代码。
-
PDO::ERRMODE_WARNING: 引发 E_WARNING 错误
-
PDO::ERRMODE_EXCEPTION: 抛出 exceptions 异常。
返回值:成功时返回 TRUE
, 或者在失败时返回 FALSE
。
运行,捕获错误,如下:
总结
3.PDOException异常处理
定义:PDOException,是PDO从Exception继承的一个用于处理PDO错误的异常类.一般如果做一套扩展,都会从去继承Exception类来实现1套明确的错误机制(错误来自哪里)
①要使用PDOException异常处理,需要设定PDO的错误模式为异常模式.在PDO可以用两种方法来实现异常模式的设定
- 在初始化PDO对象的时候,利用第四个参数指定
- 在初始化PDO之后,利用PDO::setAttribute()方法来修改错误模式
②开启异常模式后,就可以针对可能出错的位置进行异常捕捉了(通常是执行SQL语句)
③从PDO执行来讲,因为PDO异常模式的设置是在PDO实例化之后,那么如果PDO实例化的时候错误,此时好像PDOException无法工作了.事实上,PDO考虑到这点,所以PDO实例化的时候,本身可以用try-catch来捕获
④PDO执行过程中,如果遇到了意外(逻辑无法继续执行),那么也可以主动抛出异常
提醒:PDO::exec() 返回受修改或删除 SQL 语句影响的行数。如果没有受影响的行,则 PDO::exec() 返回 0
如上,删除1个不存在的记录(where s_id=100),mysql返回成功:0行受影响.即不管记录存在不存在,都是删除成功.只是受影响行数不同.这不是程序想要的.因此本例在发现如果受影响行数为0(即没有记录被删除),则抛出错误"删除失败!"