面向过程和面向对象
面向过程的代码生成"错误(error)",而面向对象的代码产生"异常"(exception)
//面向过程
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
异常处理比条件判断好的一点在于,它进一步地将程序的功能和逻辑与错误处理分离开来。进一步说,多重错误可以无须使用多层嵌套的条件语句就能得到处理。
//在该脚本中,try代码块中抛出的异常将会被catch代码块捕获并显示
function checkSoldier($age)
{
if( $age < 18 || $age > 25 ){
throw new Exception('你的年龄不达标',110);
}
}
try{
checkSoldier(-1);
}catch ( Exception $e){
var_dump($a->getMessage());
}
使用try语句时,必须确保能够捕获所有的异常,以防止出现严重错误
基本语法
try{
//可能出现错误或异常的代码
//catch 捕获 Exception是php已定义好的异常类
} catch(Exception $e){
//对异常处理,方法:
//1、自己处理
//2、不处理,将其再次抛出
}
2、处理处理程序应当包括:
Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象
扩展Exception类
PHP的Exception类十分简单,这样的设计目的,就是方便用户扩展它,根据需要来添加、修改功能
注意:Exception类中只有构造函数和__toSting()
方法是可以覆盖的,因为其他方法都被定义final
类型
补充
class MyException extends Exception
{
public function log()
{
$log = date('Y-m-d').$this->getFile().'第'.$this->getLine().'行,出现异常,异常编码为:';
$log .= $this->getCode().'异常信息为:'.$this->getMessage();
$log .= PHP_EOL;
file_put_contents('run.log',$log,FILE_APPEND);
}
}
try{
$link = @mysqli_connect('localhost','root','root','demo2');
if( !$link ){
throw new MyException('数据库连接失败');
}
}catch (MyException $a){
var_dump($a->getMessage());
}catch (Exception $e){
echo $e->getMessage();
}
//继续抛异常
try{
try{
if(1){
throw new MyException('xx',110);
}
}catch (MyException $q){
if($q->getCode() == 110){
throw $q;
}
}
}catch (Exception $e){
var_dump($e->getMessage());
}
自定义异常处理类
//PHP中对于异常的机制使用,一般用于业务逻辑判断上面,当业务逻辑不正常时,进行特殊处理
/**
1.Exception::__construct — 异常构造函数
2.Exception::getMessage — 获取异常消息内容
3.Exception::getPrevious — 返回异常链中的前一个异常
4.Exception::getCode — 获取异常代码
5.Exception::getFile — 获取发生异常的程序文件名称
6.Exception::getLine — 获取发生异常的代码在文件中的行号
7.Exception::getTrace — 获取异常追踪信息
8.Exception::getTraceAsString — 获取字符串类型的异常追踪信息
9.Exception::__toString — 将异常对象转换为字符串
10.Exception::__clone — 异常克隆
*/
class JackException extends Exception
{
public function errorMessage()
{
$errorMsg = '错误在第 '.$this->getLine().' 行 '.$this->getFile()
.': <b>'.$this->getMessage().'</b> --- 证明你在撒谎';
return $errorMsg;
}
}
$a = 0;
try{
if( !$a ){
throw new JackException('a可是不能为零啊');
}
$v = 4/$a;
}catch(JackException $e){
echo $e->errorMessage();