文档章节

PHP学习笔记7:错误和异常处理

sosly
 sosly
发布于 2016/03/04 10:01
字数 825
阅读 18
收藏 0

1、异常处理概念

1)异常处理在 try 代码块被调用执行
try
{
    //code goes here
}
2)PHP中,异常必须手动抛出
throw new Exception('message',code);
这是一个语言结构,而不是一个函数。
可以在throw子句中传递任何其他对象

3)在try代码块之后,必须至少给出一个catch代码块。
catch ( typehint exception)
{
  //  handle exception
}
可以将多个catch 代码块与一个try 代码块进行关联。
例子:
<?php

try  {
  throw new Exception("A terrible error has occurred", 42);
}
catch (Exception $e) {
  echo "Exception ". $e->getCode(). ": ". $e->getMessage()."<br />".
  " in ". $e->getFile(). " on line ". $e->getLine(). "<br />";
}

?>


2、Exception类

Exception

(PHP 5 >= 5.1.0)

简介

Exception是所有异常的基类。

类摘要

Exception {
/* 属性 */
protectedstring $message ;
protectedint $code ;
protectedstring $file ;
protectedint $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 )
final public string  getTraceAsString ( void )
public string __toString ( void )
final private void  __clone ( void )
}

属性

message

异常消息内容

code

异常代码

file

抛出异常的文件名

line

抛出异常在该文件中的行号

Table of Contents

3、用户自定义异常
用户可以扩展Exception类来创建自己的异常类。
注意,Exception类大多数公有方法都是final,不能重载,我们可以创建自己的Exception子类,但是不能改变这些基本方法的行为。但是注意,__toString()函数可以重载。
例子:
<?php

class myException extends Exception
{
  function __toString()
  {
       return "<table border=\"1\">
       <tr>
       <td><strong>Exception ".$this->getCode()."
       </strong>: ".$this->getMessage()."<br />"."
       in ".$this->getFile()." on line ".$this->getLine()."
       </td>
       </tr>
       </table><br />";
   }
}

try
{
  throw new myException("A terrible error has occurred", 42);
}
catch (myException $m)
{
   echo $m;
}

?>

4、I/O部分与建议
I/O部分容易出异常,通常,良好的编码习惯要求try代码块的代码量较少,并且在代码块的结束处捕获相关异常。
注意:如果一场没有匹配的catch语句块,PHP将报告一个致命错误。
例子:
// open file for appending
try
{
  if (!($fp =  @fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'ab')))
       throw new fileOpenException();

  if (!flock($fp, LOCK_EX))
      throw new fileLockException();

  if (!fwrite($fp, $outputstring, strlen($outputstring)))
      throw new fileWriteException();
  flock($fp, LOCK_UN);
  fclose($fp);
  echo "<p>Order written.</p>";
}
catch (fileOpenException $foe)
{
   echo "<p><strong>Orders file could not be opened.
         Please contact our webmaster for help.</strong></p>";
}
catch (Exception $e)
{
   echo "<p><strong>Your order could not be processed at this time.
         Please try again later.</strong></p>";
}

5、异常与PHP其他错误处理机制
PHP还提供了复杂的错误处理机制,注意,比如异常处理和@错误抑制并不会影响。
例子:
 if (!($fp =  @fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'ab')))
       throw new fileOpenException();

如果该函数调用失败,PHP将发出一个浸膏,根据php.ini的设置进行错误报告或记录。

© 著作权归作者所有

sosly
粉丝 5
博文 16
码字总数 26459
作品 0
杭州
私信 提问

暂无文章

九、RabbitMQ的集群安装

概述 理解RabbitMQ的集群原理可能需要花点功夫,但是配置RabbitMQ的集群则非常容易。 注意 如果有防火墙,请提前开放相关端口: client端通信口5672 管理口15672 server间内部通信口25672 e...

XuePeng77
13分钟前
0
0
今天的学习

今天学到了用ci框架向数据库添加数据,代码是这样的: $picture = $this->input->post('picture');$price = $this->input->post('price');$name = $this->input->post('name');$standa......

墨冥
21分钟前
0
0
Java agentlib参数分析

Java agentlib参数分析 再用intellij idea进行远程调试的时候,具体的配置选项如下: 标红的一行显示了远程调试需要添加的虚拟机参数。这个参数到底有什么意义? 我在命令行输入java命令,输...

Mr_Tea伯奕
38分钟前
2
0
四种软件架构演进史,程序员会一种就很牛了!

如果一个软件开发人员,不了解软件架构的演进,会制约技术的选型和开发人员的生存、晋升空间。这里我列举了目前主要的四种软件架构以及他们的优缺点,希望能够帮助软件开发人员拓展知识面。 ...

我最喜欢三大框架
42分钟前
3
0
如何做高可用的架构设计?

定义目标 既然我们的目标是做到高可用,那么我们就有必要先明确清楚高可用的含义,并通过拆解目标,让目标可以被量化。按照我的理解,可以将目标按照以下三条进行拆解: 1. 保持业务高稳定性...

别打我会飞
43分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部