热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP中Exception异常处理类的使用详解php类库

本文章介绍了在php中常用的简单的异常处理类,我们主要是讲述到了Exception处理,代码如下:?phptry{$a100;}catch(Exception


PHP中Exception异常处理类的使用详解

本文章介绍了在php中常用的简单的异常处理类,我们主要是讲述到了Exception处理,代码如下:



    try { 
         $a =10/0; 
    }catch (Exception  $e ){ 
         echo   "抛出异常" ; 
    } 
?> 

以上代码,并不会输出[抛出异常],而是输出了错误信息:Warning: Division by zero in......

说明:try块中并没有抛出异常,而是按照系统默认的错误处理机制进行处理,所以能不能捕获到异常,取决于有没有真正的抛出异常.代码如下:



class  Exception 

     protected   $message  =  'Unknown exception' ;    // 异常信息  
     protected   $code  = 0;                         // 用户自定义异常代码  
     protected   $file ;                             // 发生异常的文件名  
     protected   $line ;                             // 发生异常的代码行号  
     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();                        // 可输出的字符串  

?> 

简单的使用如下:(通过异常,抛出错误信息),代码如下:



try { 
     $error  =  'my error!' ; 
     throw   new  Exception( $error ) 
} catch (Exception  $e ) { 
     echo   $e ->getMessage(); 

我们可以扩展此类,方便我们的使用,代码如下:



class  MyException  extends  Exception 

     // 重定义构造器使 message 变为必须被指定的属性  
     public   function  __construct( $message ,  $code  = 0) { 
         // 自定义的代码  
         // 确保所有变量都被正确赋值  
        parent::__construct( $message ,  $code ); 
    } 
     // 自定义字符串输出的样式  
     public   function  __toString() { 
         return   __CLASS__  .  ": [{$this->code}]: {$this->message}n" ; 
    } 
     public   function  customFunction() { 
         echo   "A Custom function for this type of exceptionn" ; 
    } 

异常处理的基本思想是代码在try代码被调用执行。如果try码块出现错误,我们可以执行一个抛出异常的处理,某些编程语言,如java,在特定情况下将自动抛出异常。在php中,异常必须手动抛出,可以使用如下方式抛出一个异常,代码如下:

Throw new Exception(‘message’,code);

Throw 关键字将触发异常处理机制,它是一个语言结构,而不是一个函数,但是必须给它传递一个值。它要求一个接受对象。在最简单的情况下,可以实例化一个内置的Exception类。

最后,在try代码之后,必须至少给出一个catch代码块。可以将多个catch代码块与一个try代码块进行关联。如果每个catch代码块可以捕获一个不同类型的异常,可以使用多个catch代码块是有意义的。例如,如果想捕获Exception类的异常,代码如下



Catch(Exception  $e ) 

    //handing exception  

Catch代码捕获的对象就是导致异常并传递给throw语句的对象(被throw 语句抛出)。使用Exception 类的实例,是不错的选择。

Exception类提供了如下的内置方法:

Getcode() —返回传递给构造函数的代码。

GetMessage()  —返回传递给构造函数的消息。

getFile() —返回产生异常代码的文件的路径

getLine() —返回产生异常的代码所在的行。

注意: 当捕获到一个异常后,try()块里面的后续代码将不会继续执行,而是会尝试查找匹配的[catch]代码块,当抛出一个异常后,如果不进行catch处理,则会报[Uncaught exception 'Exception']错误,代码如下:



     function  test( $val ){ 
         if  ( $val >100){ 
             throw   new  Exception( "提示信息:您输入的值过大" ); 
        } 
    } 
    test(111); 
?> 

当一个异常抛出后,catch语句块可以进行处理也可以不处理,以下是我用户注册功能的部分代码



try{ 
      //check forms filled in  
      if (!filled_out( $_POST )){ 
          throw   new  Exception( '你还没有填写表单,请回去填写' ); 
     } 
      //check email address not valid  
      if (!check_email( $email )){ 
         throw   new  Exception( '邮件的格式不正确' ); 
     } 
      //检查密度的长度是否大于6  
      if ( strlen ( $passwd <6)){ 
          throw   new  Exception( &#39;密度的长度应该大于6&#39; ); 
     } 
      //检查两次密码是否相等  
      if ( $passwd != $passwd1 ){ 
          throw   new  Exception( &#39;两次密码不一样,请重新输入&#39; ); 
     } 
      //检查用户名的长度是否正确  
      if ( strlen ( $username )>16){ 
          throw   new  Exception( &#39;用户名的长度不符,请重新输入&#39; ); 
     } 
    
 } catch(Exception  $e ){ 
      echo   $e ->getMessage();  //输出异常信息。  
 } 

php对异常的处理与java一样,用到的是try{}catch(){},定义顶级异常处理器用到的函数是:set_exception_handler("My_exception");这里的My_expection是开发者自定义的异常处理函数,既顶级异常处理器,只有当程序中没有函数来处理异常才有顶级异常处理器来处理异常,如果没有定义顶级异常处理器,则由系统默认的异常处理器来处理异常,举例说明:



    set_exception_handler( "My_expection" ); 
     function  My_expection(){ 
         echo   "这里是顶级异常处理器" ; 
    } 
    try{ 
        nohello( "hello" ); 
    }catch(Exception  $e ){ 
         throw   $e ; 
    } 
   function  nohello( $nohello ){ 
           if ( $nohello  ==  "hello" ){ 
               throw   new  Exception( "不能输入hello" ); 
          } else { 
             echo   "输入成功" ; 
        } 
    } 
?> 



推荐阅读
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
author-avatar
双子-殇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有