详细解读php的异常处理机制

异常机制

一.异常基本知识

1.定义:异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程,这过程称为异常.

2.基本用法:

try

{

//可能出现的错误(异常)代码

}

catch(Exception $e)

{

//自己处理:捕捉异常并处理,

//自己不处理:抛出一个异常,即如下:

throw $e;

}

其中,Exception是异常类(php中定义好的一个类,具体参见php参考文档:语音参考->异常处理).它已经封装好很多方法,常用如下:

function __construct($message = null, $code = 0);

final function getMessage();                // 返回异常信息

final function getCode();                   // 返回异常代码

final function getFile();                   // 返回发生异常的文件名

final function getLine();                   // 返回发生异常的代码行号

final function getTrace();                  // backtrace() 数组

final function getTraceAsString();          // 已格成化成字符串的 getTrace() 信息

/* 可重载的方法 */

function __toString();                       // 可输出的字符串

3.入门案例

案例1:

<?php
 try{
 adduser("weimin");
 echo "adduser()如果出现异常,这句话就不会出现<br>";
 updateuser("wly1");
 echo "updateuser()如果出现异常,这句话就不会出现<br>";
 }
 catch(Exception $e)
 {
 echo "error!".$e->getMessage();
 //getMessage()为异常中一个函数,可返回异常信息
 }
 function adduser($username)
 {
 if($username=="weimin")
 {
 
 }
 else
 {
 throw new Exception("添加失败");//抛出异常,及返回一个异常
 }
 }
 function updateuser($username)
 {
 if($username=="wly")
 {
 
 }
 else
 {
 throw new Exception("修改失败");//抛出异常
 }
 }
?>

结果:

adduser()如果出现异常,这句话就不会出现

error!修改失败

来自 <http://localhost/exception/exception01.php>

二.异常使用的注意事项

1.异常的基本处理:

(1).当异常被抛出,其后的代码不会继续执行,php尝试查找匹配的catch代码块;见案例1.

(2).如果异常没有被捕获,而且有没有使用set_exception_handler()做相应的处理,那么会发生一个严重的错误(致命错误),并输出"Uncaught Exception"(未捕获异常)的错误消息;

(3).当catch一个异常,可以进行处理或者不进行处理(在catch函数中,直接抛出异常,即 throw $e,这时将启动php系统默认异常处理器(函数)来处理,见案例2。或者自己定义一个顶级异常处理器(函数),见案例3);

通俗理解:即第一次抛出异常后,使用try{},ctach{}捕获到第一次抛出的异常,这时我们如果不对第一次抛出的异常进行处理,可以将此异常进行第二次抛出,这时,此异常将交给php默认异常处理器(函数)进行处理,或者交给用户自己定义的顶级异常处理器(函数)进行处理。

其中,定义顶级异常处理,需要两个步骤:

步骤一:定义顶级异常处理函数;

步骤二:修改默认定义异常处理函数set_exception_handler("函数名");

案例2:

<?php
  function A1($val)
  {
  if($val=="A")
  {
 
throw new Exception ("不要输入A");//第一次抛出异常
  }
  }
   function B1($val)
  {
  if($val=="B")
  {
 
throw new Exception ("不要输入B");//第一次抛出异常
  }
  }
  try
  {
  A1("A");
  }
  catch(Exception $e)
  {
 
throw $e; //第二次抛出异常
 
/*捕获异常后,继续抛出异常(第二次抛出异常),这时候将会启动php默认的异常处理器来处理,
  也可以自己定义一个顶级异常处理*/
  }
?>

结果:

Fatal error: Uncaught exception ‘Exception‘
with message ‘不要输入A‘ in
E:\Software_default\wamp_wwwroot\exception\exception02.php:6 Stack trace: #0
E:\Software_default\wamp_wwwroot\exception\exception02.php(18): A1(‘A‘) #1
{main} thrown in E:\Software_default\wamp_wwwroot\exception\exception02.phpon line 6

来自 <http://localhost/exception/exception02.php>

案例3:

<?php
 
 function MyException($e)//用户定义的顶级异常处理函数
  {
 
echo "<b>我是顶级异常处理函数,</b>其中,异常信息为:".$e->getMessage();
  }
 
set_exception_handler("MyException");//修改默认的顶级异常处理函数
  function A1($val)
  {
  if($val=="A")
 throw new Exception ("不要输入A");//抛出异常
  }
   function B1($val)
  {
  if($val=="B")
   
throw new Exception ("不要输入B");  
  }
  try
  {
  A1("A");
  }
  catch(Exception $e)
  {
  throw $e;
 
/*继续抛出异常,这时候将会启动php默认的异常处理器来处理,
  也可以自己定义一个顶级异常处理*/
  }
?>

结果:

我是顶级异常处理函数,其中,异常信息为:不要输入A

来自 <http://localhost/exception/exception03.php>

(4).如果抛出一个异常,就必须捕获它(否则会报错,产生Fatal error错误),或者使用用户定义的顶级异常处理函数进行处理

2.也可以自己定义一个异常类

class MyException Exception

{

}

3.使用多个catch代码块可以捕获不同种类的异常

(1).基本用法

try

{

//代码

//可能抛出多种异常

}

catch(PDOException $e)//数据库异常

{

//代码

}

catch(Exception $e)

{

//代码

}

(2).案例

案例4:

<?php
   //定义一个异常类
   class MyException1 extends Exception{
  
   }
    class MyException2 extends Exception{
  
   }
  
   function A()
   {
   throw new MyException1("a");
   }
   function B()
   {
   throw new MyException1("b");
   }
    function C()
   {
   try{
  
A();//抛出MyException1
  
B();//抛出MyException2
   }
   catch(Exception1 $e1){
   echo $e1->getMessage();
   }
   catch(Exception2 $e2){
   echo $e2>getMessage();
   }
   }
   C();
?>

结果:

Fatal error: Uncaught
exception ‘MyException1‘ with message ‘a‘ in
E:\Software_default\wamp_wwwroot\exception\exception04.php:12 Stack trace: #0
E:\Software_default\wamp_wwwroot\exception\exception04.php(21): A() #1
E:\Software_default\wamp_wwwroot\exception\exception04.php(31): C() #2 {main}
thrown in E:\Software_default\wamp_wwwroot\exception\exception04.phpon line 12

来自 <http://localhost/exception/exception04.php>

由于产生不捕获的异常,php默认显示其异常处理函数,这时,我们添加用户自定义的顶级处理函数

案例5:

<?php
    //定义一个异常类  
   class MyException1 extends Exception{  
   
   }
    class MyException2 extends Exception{  
    
   }
    function MyException($e)
  {
 
      echo "<b>我是顶级异常处理函数,</b>其中,异常信息为:".$e->getMessage();
  }
 
set_exception_handler("MyException");//修改默认的顶级异常处理函数
   function A()
   {
   throw new MyException1("a");
   }
   function B()
   {
   throw new MyException1("b");
   }
    function C()
   {
   try{
  
A();//抛出MyException1
  
B();//抛出MyException2
   }
  
catch(Exception1 $e1){//Exception1 是异常类名
   echo $e1->getMessage();
   }
  
catch(Exception2 $e2){//Exception2是异常类名
   echo $e2>getMessage();
   }
   }
   C();
?>

结果:

我是顶级异常处理函数,其中,异常信息为:a

来自 <http://localhost/exception/exception05.php>

3.PHP异常抛出的BUG

案例6:

<?php
try{
$a=8/0;
}
catch(Exception $e){
echo
$e->getMessage();
echo "异常";
}
?>

结果:

Warning: Division by zero in E:\Software_default\wamp_wwwroot\exception\exception06.phpon line 3

来自 <http://localhost/exception/exception06.php>

在案例6中,8/0,php认为是错误,而不是异常,所以,没有抛出异常,因此捕获不到异常

案例7:

<?php
try{
$f=fopen("aa.txt","r");//aa.txt在当前路径下并不存在
}
catch(Exception $e){
echo
$e->getMessage();
echo "异常";
}
?>

结果:

Warning: fopen(aa.txt) [function.fopen]: failed to
open stream: No such file or directory in E:\Software_default\wamp_wwwroot\exception\exception07.phpon line 3

来自 <http://localhost/exception/exception07.php>

在案例7中, fopen()是一个很老的函数,从php1就已经存在了,当时并没有异常处理机制,php认为是错误,而不是异常,所以,没有抛出异常,因此捕获不到异常

时间: 2024-10-13 12:35:45

详细解读php的异常处理机制的相关文章

Ehcache详细解读

Ehcache详细解读 Ehcache  是现在最流行的纯Java开源缓存框架,配置简单.结构清晰.功能强大,最初知道它,是从Hibernate的缓存开始的.网上中文的EhCache材料以简单介绍和配置方法居多,如果你有这方面的问题,请自行google:对于API,官网上介绍已经非常清楚,请参见官网:但是很少见到特性说明和对实现原理的分析,因此在这篇文章里面,我会详细介绍和分析EhCache的特性,加上一些自己的理解和思考,希望对缓存感兴趣的朋友有所收获. 一.特性一览 ,来自官网,简单翻译一下

MemCache超详细解读

MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度.MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串.对象等)所使用的key-value存储,数据可以来自数据库调用.API调用,或者页面渲染的结果.MemCache设计理念就是小而强大,它简单的设计促进了快速部署.易于开发并解决面对大规模的数据缓存的

Java从零开始(3)异常处理机制

异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做相同处理,感觉相当的麻烦! Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,所有的异常都可以用一个类型来表示,不同类型的异常对应不同的子类异常(这里的异常包括错误概念),定义异常处理的规范,在1.4版本以后增加了异常链机制,从而便于跟踪异常!这是Java语

Atitit.js javascript异常处理机制与java异常的转换.js exception process Voae

Atitit.js javascript异常处理机制与java异常的转换.js exception processVoae 1. 1. javascript异常处理机制 1 2. 2. Web前后台异常的统一处理 1 3.  java异常转换为js异常 1 3. -------------详细代码 2 1. 1. javascript异常处理机制 Throw str Not throw error  ..cause ie,ff error obj is diff.. 2. 2. Web前后台异常

异常处理机制

1.使用try...catch捕捉异常 如果执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,这个异常对象会被提交给Java的运行时环境,把这个过程叫做"抛出异常" java的运行时环境受到异常对象后,就会寻找这个异常对象的处理catch语句,如果找到合适的,就把这个异常对象交给catch语句块处理,这个过程被称为"捕获异常" 要是捕获不到异常,运行时环境被终止,退出程序 无论处在哪里的代码块,只要出现异常,都会产生异常对象. 2.异常类的继承体系

Ehcache详细解读(转载)

Ehcache 是现在最流行的纯Java开源缓存框架,配置简单.结构清晰.功能强大,最初知道它,是从Hibernate的缓存开始的.网上中文的EhCache材料以简单介绍和配置方法居多,如果你有这方面的问题,请自行google:对于API,官网上介绍已经非常清楚,请参见官网:但是很少见到特性说明和对实现原理的分析,因此在这篇文章里面,我会详细介绍和分析EhCache的特性,加上一些自己的理解和思考,希望对缓存感兴趣的朋友有所收获. 一.特性一览,来自官网,简单翻译一下: 1.快速轻量过去几年,诸

C++ 异常处理机制的实现

http://blog.jobbole.com/103925/ 本文深入讨论了VC++编译器异常处理的实现机制.附件源代码包含了一个VC++的异常处理库. 下载源代码 – 19 Kb 介绍 相对于传统语言,C++ 的革命性特征之一,就是它对异常处理的支持.传统异常处理技术有缺陷并且易于出错,而 C++ 提供了一个非常优秀的替代方案.它将正常流程代码与错误处理代码清晰的隔离出来,使得程序更加健壮,易于维护.这篇文章将讨论编译器是如何实现异常处理的.假定读者已经对异常处理机制及其语法已经有了大致的了

ASP.NET(C#)中的try catch异常处理机制

在开发一个Umbraco平台系统的过程中,遇到了问题. 写的代码如下 fileUrl = MediaHelper.GetMediaUrl(Convert.ToInt32(publishedContent.GetProperty("mediaPdf").DataValue.ToString())); 这个是在Umbraco后台建立了一个pdfInfo的DocumentType, 它里面有个属性是mediaPicker, 从media文件夹中选取pdf文件.这个属性名称是mediaPdf,

C语言中的异常处理机制

#define try if(!setjmp(Jump_Buffer)) 返回try现场后重新执行判断,所以有两次执行. http://blog.csdn.net/tian_dao_chou_qin/article/details/6386621 1.概述 什么是异常?异常一般指的是程序运行期(Run-Time)发生的非正常情况.异常一般是不可预测的,如:内存不足.打开文件失败.范围溢出等.UNIX 使用信号给出异常,并当发生异常时转跳到信号处理过程进行异常处理.DOS下的信号对比UNIX系统而