要使用异常,首先得知道那些部分会产生异常,产生什么类型异常(php常见异常见下方符表),对产生的异常该怎么办。

如果知道程序的那些部分会产生异常,那么就对这一部分使用try关键字;

如果知道了产生异常的部分产生的是什么类型的异常,那么就可以使用throw关键字抛出这个异常类的实例,要是不知道是什么类型的异常,那就用基类Exception

当知道了程序会产生什么类型的异常,也抛出了异常,最后就可以使用catch关键字捕获并处理异常。

首先用面向对象的方法来实现上面的思路。

这里捕捉的是PDO类异常:

 <?php
try{
$dsn = 'mysql:127.0.0.1;db_name=user';
$pdo = new PDO( $dsn, 'roo', 'root' );
// 自己写的代码不需要抛出PDO异常实例
}catch( PDOException $e ){
// 获得异常信息
echo '异常信息:'.$e ->getMessage().PHP_EOL,
'异常编号:'.$e ->getCode().PHP_EOL,
'异常行号:'.$e ->getLine().PHP_EOL,
'异常文件:'.$e ->getFile().PHP_EOL;
}
 异常信息:SQLSTATE[HY000] [1045] Access denied for user 'roo'@'localhost' (using password: YES)
异常编号:1045
异常行号:4
异常文件:D:\workspace\project_shop\test.php

使用所有异常类的基类,Exception类。

 <?php
try{
$a;
throw new Exception( '变量没有定义!', 250 );
}catch( Exception $e ){
// 处理异常
echo '异常信息:'.$e ->getMessage().PHP_EOL,
'异常编号:'.$e ->getCode().PHP_EOL,
'异常行号:'.$e ->getLine().PHP_EOL,
'异常文件:'.$e ->getFile().PHP_EOL;
}
异常信息:变量没有定义!
异常编号:250
异常行号:4
异常文件:D:\workspace\project_shop\test.php

自定义异常类,MyException类

 <?php
class MyException1 extends Exception {
public function show_exception_info(){
echo '异常信息:'.$this ->getMessage().PHP_EOL,
'异常编号:'.$this ->getCode().PHP_EOL,
'异常行号:'.$this ->getLine().PHP_EOL,
'异常文件:'.$this ->getFile().PHP_EOL;
}
}
class MyException2 extends Exception {
public function show_exception_info(){
echo '异常信息:'.$this ->getMessage().PHP_EOL,
'异常编号:'.$this ->getCode().PHP_EOL,
'异常行号:'.$this ->getLine().PHP_EOL,
'异常文件:'.$this ->getFile().PHP_EOL;
}
}
class MyException3 extends Exception {
public function show_exception_info(){
echo '异常信息:'.$this ->getMessage().PHP_EOL,
'异常编号:'.$this ->getCode().PHP_EOL,
'异常行号:'.$this ->getLine().PHP_EOL,
'异常文件:'.$this ->getFile().PHP_EOL;
}
}
try{
$a = 2;
switch( true ){
case $a > 3:
throw new MyException3( '变量大于3,超载!', 253 );
break;
case $a > 2:
throw new MyException2( '变量大于2,超载!', 252 );
break;
default:
throw new MyException1( '变量没有定义!', 250 );
break;
} }catch( MyException3 $e ){
// 处理异常
$e ->show_exception_info();
}catch( MyException2 $e ){
// 处理异常
$e ->show_exception_info();
}catch( MyException1 $e ){
// 处理异常
$e ->show_exception_info();
}finally{
echo '最终我还是执行了!';
}

虽然上面提到需要用catch捕获异常,但下面的就不用:

 function show_exception_info( $e ){
echo '异常信息:'.$e ->getMessage().PHP_EOL,
'异常编号:'.$e ->getCode().PHP_EOL,
'异常行号:'.$e ->getLine().PHP_EOL,
'异常文件:'.$e ->getFile().PHP_EOL;
}
set_exception_handler( 'show_exception_info' );
throw new Exception( '异常信息传过去!', 22222 );
异常信息:异常信息传过去!
异常编号:22222
异常行号:9
异常文件:D:\workspace\project_shop\test.php

php异常处理面向对象和面向函数使用的更多相关文章

  1. 面向函数范式编程(Functional programming)

    函数编程(简称FP)不只代指Haskell Scala等之类的语言,还表示一种编程思维,软件思考方式,也称面向函数编程. 编程的本质是组合,组合的本质是范畴Category,而范畴是函数的组合. 首先 ...

  2. 大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)

    一,总体概要 1,笔者浅谈 我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭(面向对象式编程因为引入了类.对象.实例等概念,非常贴合人类对于世间万物的认 ...

  3. JavaSE——面向对象与面向过程、类与对象、(属性、方法、构造器)等

    一:面向对象与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程: 1.面向过程思想强调的是过程(动作). 2.在面向过程的开发中,其实就是面向着具体的每一个步骤和过程,把每一个步 ...

  4. C#学习笔记——面向对象、面向组件以及类型基础

    C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...

  5. Java基础知识强化20:面向对象和面向过程的思想对比

    面向对象与面向过程的区别  1. 与面向对象编程思想相比较的,往往是面向过程的编程思想,其实在我来理解,两者并不冲突,原因是面向对象的编程也必须使用面向过程的思维来实现具体的功能,所以我认为,两者的区 ...

  6. python的面向对象和面向过程

    一.面向对象和面向过程的区别: a.面向过程: 1)根据业务逻辑从上到下写代码 2)开发思路是将数据和函数按照执行的逻辑顺序组织在一起 3)分开考虑数据与函数 定义性文字: 面向对象编程(Object ...

  7. 面向对象和面向过程,python中的类class,python中程序的入口——main方法,

    1.程序入口,让main显现出来: print(__name__)#__name___是模块中的隐藏字段,当前模块运行的函数名 if __name__ == __main__ __main__() # ...

  8. PHP面向对象和面向过程

    编程界不论是PHP.Python都有这么两种编程思想,oop面向对象.pop面向过程,这两种在功能上没有多大区别,但是在代码编写上却有很大区别.今天就记录一下面向对象和面向过程的优点.缺点.定义.实现 ...

  9. Day5-1 面向对象和面向过程

    摘要: 类的定义 类的增删改查 对象的增删改查 对象的查找和绑定 面向对象和面向过程的区别: 1.面向过程就像是工厂的流水线,按部就班的有序的工作. 优点:把复杂的问题简单化 缺点:可扩展性差.一个步 ...

随机推荐

  1. MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载)

    https://blog.csdn.net/panwen1111/article/details/79245161 目录MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整De ...

  2. Object.keys()、Object.values()、Object.entries()的用法

    一.Object.keys(obj) 参数:要返回其枚举自身属性的对象 返回值:一个表示给定对象的所有可枚举属性的字符串数组 处理对象,返回可枚举的属性数组 let person = {name:&q ...

  3. 移动端IM系统的协议选型:UDP还是TCP?(转)

    源: 移动端IM系统的协议选型:UDP还是TCP?

  4. Linux_CentOS常用命令和shell命令技巧

    Linux_CentOS常用命令 关机 init 重启 init 列出当前目录的下的文件 ls //列出当前目录下的文件 ll //列出当前目录下的文件信息 等同ls -l 命令 切换目录 cd 目录 ...

  5. 【转】Django继承AbstractUser新建User Model时出现auth.User.groups: (fields.E304)错误

    错误详情如下: (venv) D:\workspace\music>python manage.py makemigrations SystemCheckError: System check ...

  6. nginx奔溃自动重启Shell脚本

    # vi /usr/local/nginx/sbin/nginx_restart.sh 贴入一下代码: #!/bin/bash #www.xmsolink.com #Monitor nginx ser ...

  7. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...

  8. linux系统执行.exe文件

    首先要了解一下Wine: Wine (“Wine Is Not an Emulator” 的首字母缩写)是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux,Mac OSX 及 ...

  9. Spring cloud微服务安全实战_汇总

    Spring cloud微服务安全实战 https://coding.imooc.com/class/chapter/379.html#Anchor Spring Cloud微服务安全实战-1-1 课 ...

  10. oracle DBA 常用表和视图

    ☆dba_开头.....   dba_users      数据库用户信息   dba_segments  表段信息   dba_extents    数据区信息   dba_objects    数 ...