PHP异常处理浅析

   这篇文章主要介绍了PHP异常处理浅析,本文着重讲解如何捕获异常,并给出代码操作实例,需要的朋友可以参考下

  PHP预定了两个异常类:Exception和ErrorException

   代码如下:

  Exception {

  /* 属性 */

  protected string $message ; //异常消息内容

  protected int $code ; //异常代码号

  protected string $file ; //抛出异常的文件名

  protected int $line ; //抛出异常在该文件中的行号

  /* 方法 */

  public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = null]]] )

  final public string getMessage ( void ) //异常抛出的信息

  final public Exception getPrevious ( void ) //前一异常

  final public int getCode ( void ) //异常代码,这是用户自定义的

  final public string getFile ( void ) //发生异常的文件路劲

  final public int getLine ( void ) //发生异常的行

  final public array getTrace ( void ) //异常追踪信息(array)

  final public string getTraceAsString ( void ) //异常追踪信息(string)

  public string __toString ( void ) //试图直接 将异常对象当作字符串使用时调用子函数的返回值

  final private void __clone ( void ) //克隆异常对象时调用

  }

   代码如下:

  ErrorException extends Exception {

  /* 属性 */

  protected int $severity ;

  /* 方法 */

  public __construct ([ string $message = "" [, int $code = 0 [, int $severity = 1 [, string $filename = __FILE__ [, int $lineno = __LINE__ [, Exception $previous = NULL ]]]]]] )

  final public int getSeverity ( void )

  /* 继承的方法 */

  final public string Exception::getMessage ( void )

  final public Exception Exception::getPrevious ( void )

  final public int Exception::getCode ( void )

  final public string Exception::getFile ( void )

  final public int Exception::getLine ( void )

  final public array Exception::getTrace ( void )

  final public string Exception::getTraceAsString ( void )

  public string Exception::__toString ( void )

  final private void Exception::__clone ( void )

  }

  那么如何捕获异常?

  (1)PHP可用try...catch...捕获异常,进行异常处理的代码必须在try代码块内。

   代码如下:

  try {

  throw new Exception('exception test 1', 1001);

  } catch(Exception $e) {

  echo $e->getMessage().'-'.$e->getCode();

  }

  (2)用户可以自定义异常处理函数[set_exception_handler],用于没用用try/catch捕获的异常。

   代码如下:

  function exception_handler ( $e ) {

  echo "Uncaught exception: " , $e -> getMessage (), "n" ;

  }

  set_exception_handler ( 'exception_handler' );

  throw new Exception ( 'Uncaught Exception' );

  echo "这行不会执行了";

  可以看到使用ser_exception_handler回调函数处理异常,后续的代码不会继续执行,但try-catch可以。

  (3)PHP可用多catch捕获不同类型异常,并允许在catch代码块内再次抛出异常。

  代码如下:

  //请根据实际扩展异常类

  class MyException extends Exception {

  public function __construct($message = '', $code = 0) {

  }

  public function myFunction() {

  echo 'just for test';

  }

  }

  try {

  throw new MyException('an error');

  } catch (MyException $e) {

  echo $e->myFunction();

  } catch (Exception $e) {

  echo $e->getMessage();

  }

  (4)PHP5.5已经支持finally关键词,你无需关心异常是否溢出了。


  可对比如下:

   代码如下:

  function doSomething() {

  $resource = createResource();

  try {

  $result = useResource($resource);

  } catch (Exception $e) {

  releaseResource($resource);

  log($e->getMessage());

  exit();

  }

  releaseResource($resource);

  return $result;

  }

  //使用finally后

  function doSomething2() {

  $resource = createResource();

  try {

  $result = useResource($resource);

  return $result;

  } catch (Exception $e) {

  log($e->getMessage());

  exit();

  } finally {

  releaseResource($resource);

  }

  }

时间: 2024-08-30 23:08:08

PHP异常处理浅析的相关文章

PHP异常处理浅析_php实例

PHP预定了两个异常类:Exception和ErrorException 复制代码 代码如下: Exception {     /* 属性 */     protected string $message ; //异常消息内容     protected int $code ; //异常代码号     protected string $file ; //抛出异常的文件名     protected int $line ; //抛出异常在该文件中的行号     /* 方法 */     publ

MySQL异常处理浅析_Mysql

MySQL的异常处理分析如下: 标准格式 DECLARE handler_type HANDLER FOR condition_value[,...] statement handler_type: CONTINUE | EXIT | UNDO --这个暂时不支持 condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_err

浅析Lua编程中的异常处理

  这篇文章主要介绍了浅析Lua编程中的异常处理,是Lua入门学习中的基础知识,要的朋友可以参考下 需要进行错误处理 错误处理是必要的,因为真实世界中的操作通常需要使用复杂的操作,包括文件操作,数据库事务和web服务调用.没人关心错误的业务,涉及保密信息或金钱交易时造成大的损失. 在任何编程,总是有错误处理的要求.错误可以是两种类型,其中包括, 语法错误 运行时错误 语法错误 因使用不当造成的各种程序组件,如运算符和表达式中出现语法错误.一个简单的例子中的语法错误如下所示. 代码如下: a ==

浅析Java异常处理中断言的使用_java

断言的概念 断言用于证明和测试程序的假设,比如"这里的值大于 5". 断言可以在运行时从代码中完全删除,所以对代码的运行速度没有影响.断言的使用 断言有两种方法: 一种是 assert<<布尔表达式>> : 另一种是 assert<<布尔表达式>> :<<细节描述>>. 如果布尔表达式的值为false , 将抛出AssertionError 异常: 细节描述是AssertionError异常的描述文本使用 java

浅析Java Web错误/异常处理页面_java

发生服务器 500 异常,如果默认方式处理,则是将异常捕获之后跳到 Tomcat 缺省的异常页面,如下图所示. 不论哪个网站都是一样的,所以为了满足自定义的需要,Tomcat 也允许自定义样式的.也就是在 web.xml 文件中配置: <error-page> <error-code>500</error-code> <location>/error.jsp</location> </error-page> 首先说说自带的逻辑.如果某

浅析Lua编程中的异常处理_Lua

 需要进行错误处理 错误处理是必要的,因为真实世界中的操作通常需要使用复杂的操作,包括文件操作,数据库事务和web服务调用.没人关心错误的业务,涉及保密信息或金钱交易时造成大的损失. 在任何编程,总是有错误处理的要求.错误可以是两种类型,其中包括,     语法错误     运行时错误 语法错误 因使用不当造成的各种程序组件,如运算符和表达式中出现语法错误.一个简单的例子中的语法错误如下所示. 复制代码 代码如下: a == 2 如你所知,有使用单一等于和双等于之间的差异.使用一个替代其他可导致

linux进程调度浅析

操作系统要实现多进程,进程调度必不可少. 有人说,进程调度是操作系统中最为重要的一个部分.我觉得这种说法说得太绝对了一点,就像很多人动辄就说"某某函数比某某函数效率高XX倍"一样,脱离了实际环境,这些结论是比较片面的. 而进程调度究竟有多重要呢? 首先,我们需要明确一点:进程调度是对TASK_RUNNING状态的进程进行调度(参见<linux进程状态浅析>).如果进程不可执行(正在睡眠或其他),那么它跟进程调度没多大关系. 所以,如果你的系统负载非常低,盼星星盼月亮才出现一

Win32结构化异常处理(SEH)探秘(上)

在 Win32 操作系统提供的所有功能中,使用最广泛但最缺乏文档描述的也许就是结构化异常处理了(SEH),当你考虑 Win32 结构化异常处理时,你也许会想到诸如 _try,_finally 以及 _except 这些术语.你能在任何有关 Win32 的书中发现对 SEH 很好的描述(即使是 remedial).即便是 Win32 SDK 也具备有相当完整的使用 _try,_finally 和 _except 进行结构化异常处理的概述. 有了这些文档,那为何还说 SEH 缺乏文档呢?其实,Win

linux内存管理浅析

[地址映射](图:左中) linux内核使用页式内存管理,应用程序给出的内存地址是虚拟地址,它需要经过若干级页表一级一级的变换,才变成真正的物理地址. 想一下,地址映射还是一件很恐怖的事情.当访问一个由虚拟地址表示的内存空间时,需要先经过若干次的内存访问,得到每一级页表中用于转换的页表项(页表是存放在内存里面的),才能完成映射.也就是说,要实现一次内存访问,实际上内存被访问了N+1次(N=页表级数),并且还需要做N次加法运算. 所以,地址映射必须要有硬件支持,mmu(内存管理单元)就是这个硬件.