### 概述
程序运行与预期不太一致,与错误是两个不同的概念 .
### 语法
每一个try都需要对应一个catch或者多个catch代码块 ,用来捕获不同类产生的异常 . 如果try代码块没有找到异常PHP将会跳过catch代码块进行下面的程序运行 . 如果有一个异常被抛出的话,throw里面的代码就不会被执行了 .
~~~
try{
需要进行异常处理的代码段;
}catch(Exception $e){
...
}catch(Exception $e){
...
}catch(Exception $e){
...
}
~~~
### 经典除零案例
~~~
$num = null;
try{
$num = 3 / 0;
var_dump($num);
} catch(Exception $e){
echo $e->getMessage();
}
echo 'continue...';
~~~
结果
~~~
Warning: Division by zero in C:\Users\Artisan\Desktop\project\Test\index.php on line 5
float(INF)
continue...
~~~
程序并没有跑到catch段中 . 当我们遇到0当除数的时候,这触发了PHP中本身的一个错误,而没有走到catch段中, 反而产生了一个警告 .**也就是说PHP首先触发的是错误,而不会自动的抛出异常** . 在PHP中必须手动,主动的通过throw抛出异常才可以 .
### 通过throw抛出异常
~~~
$num1 = 3;
$num2 = 0;
try{
if($num2 == 0){
throw new Exception("0不能当做除数"); //throw之后的代码不会被执行
echo "这里不会被执行";
}else{
$result = $num1 / $num2;
}
} catch(Exception $e){
echo $e->getMessage(); //之后可以通过die()或者return 来停止程序 .
}
echo 'continue...';
~~~
~~~
0不能当做除数
continue...
~~~
PHP的异常和其他语言不太一样, 在Java中它认为除0就是异常,它就会捕获,并进行处理 . PHP的异常机制还不太完善 .
### PHP内置异常类
PHP也内置了一些异常类, 也可以不通过throw的方式去抛出异常 .比PDO异常类 .
~~~
try{
$pdo = new PDO("mysql:host=localhost;dnname=mysql",'root','xxxx');//这里并没有手动throw
}catch(Exception $e){
echo $e->getMessage();
}
~~~
结果
~~~
SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)
~~~
### 错误和异常的区别
当遇到错误的时候,PHP会主动的触发错误,而不会主动的抛出异常 . 只有他通过throw语句来抛出异常, 然后通过catch来捕获异常 . 在PHP中错误已经很有用了,但是错误和异常还是有区别的 . 首先,他们是两个不同的机制 . 错误是没有办法在调用的时候向上传递的 ,因为错误必须马上进行处理 .而异常会一一向上传递,直到我们去捕获 . 在发生错误的时候,我们必须要对我们的错误脚本进行处理 ,而异常可以自定义的来处理异常错误信息. 如果没有错误消息,我们很难确定程序哪里出现了哪些问题 ,因为我们触发的任何错误都不具有相关的错误代码或者名称 . 这时候异常的好处就体现出来了,因为异常都是通过代码来抛出,接着通过代码向上传递,直到我们通过代码来捕获异常信息 .
- PHP加密技术
- md5加密
- Crypt加密
- 函数
- 概述
- 强类型参数
- 可变参数列表
- 值传递&引用传递
- 变量作用域
- 可变函数
- 嵌套函数
- 递归函数
- 匿名函数(闭包)
- 面向对象
- 概念
- 类
- 对象的传值
- 对象的克隆
- 构造方法
- 析构方法
- 克隆方法
- $this
- 类常量
- 静态属性
- 静态方法
- 继承
- 重写
- 重载
- 概述
- 属性重载
- 概述
- __set()
- __get()
- __unset()
- __isset()
- 方法重载
- 概述
- __call()
- __callstatic()
- 封装
- 最终类
- 抽象类
- 接口
- 对象的序列化与反序列化
- __sleep()
- __wakeup()
- 其他魔术方法
- 对象的遍历
- 类和对象相关函数
- 错误
- 概述
- 设置错误级别
- trigger_error()触发错误
- 处理PHP中的错误
- 异常
- 概述
- 自定义异常类
- 自定义文件写入异常类
- 记录和发送异常信息
- 使用观察者模式处理异常信息
- 自定义异常处理器
- 设计模式
- 创建型
- 单例模式
- 工厂模式
- 原型模式
- 结构型
- 注册树模式
- 适配器模式
- 数据映射模式
- 装饰器模式
- 代理模式
- 行为型
- 策略模式
- 观察者模式
- 迭代器模式
- 网络
- cURL
- Oauth2.0
- QQ第三方登录
- TCP/IP协议
- 概述
- HTTP协议
- 概述
- HTTP请求协议
- HTTP响应协议
- WebSocket
- 安装扩展
- Redis
- Socket
- 计算机通信
- socket简介
- PHP操作socket
- TCP
- HTTP服务端
- WebSocket
- PHP7
- 生成器yield
- 异常finally
- CGI和FPM
- php有用命令
- 内存