要使用异常,首先得知道那些部分会产生异常,产生什么类型异常(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. LAMP企业架构读写分离

    1.1  LAMP企业架构读写分离 LAMP+Discuz+Redis缓解了MYSQL的部分压力,但是如果访问量非常大,Redis缓存中第一次没有缓存数据,会导致MYSQL数据库压力增大,此时可以基于 ...

  2. 分享7个shell脚本实例--shell脚本练习必备

    概述 看多shell脚本实例自然就会有shell脚本的编写思路了,所以我一般比较推荐看脚本实例来练习shell脚本.下面分享几个shell脚本实例. 1.监测Nginx访问日志502情况,并做相应动作 ...

  3. Coupled和segregated【转载】

    转载自:http://blog.sina.com.cn/s/blog_67873f6c0100ltq6.html 问题1: 我看中文帮组里说是'分离'的意思?我绝对翻译不太好,请问有更好的翻译吗? 和 ...

  4. Perl字符贪吃蛇

    一时兴起,想试试能不能用perl实现字符贪吃蛇,算法如下: 定义2个数组@bg.@snake,@bg用来显示整个界面,@snake从蛇头开始保存蛇的坐标点. 蛇每移动一次,新的坐标点放到@snake头 ...

  5. Go -- client 302 自动转 200 问题 cookie存储 模拟登陆问题

    不久前用go写了个http client,去模拟某网站(*.com)的登录操作.网站的登录逻辑:1.验证登录账号和密码:2.下发token.此token通过cookie下发:3.redirect到主页 ...

  6. JVM 初始化阶段的重要意义分析

    1.创建一个Mytest6类和Singleton类 public class MyTest6 { public static void main(String[] args) { Singleton ...

  7. Oracle中的统计信息

    一.什么是统计信息 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.例如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于 ...

  8. 【转载】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)

    原文链接:https://www.cnblogs.com/lixinjie/p/10811219.html 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使 ...

  9. git命令note

    日志查看 git log 太乱? git log --pretty=oneline 版本回退 git reset --hard commit_id git reset --hard HEAD^ 上上版 ...

  10. Python中if __name__ == '__main__':的作用和原理

    if __name__ == '__main__':的作用 一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行. ...