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

读《PHP和MySQL Web开发》笔记合集:

http://my.oschina.net/bluefly/blog/478580

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

  • Exception::__construct — 异常构造函数
  • Exception::getMessage — 获取异常消息内容
  • Exception::getPrevious — 返回异常链中的前一个异常
  • Exception::getCode — 获取异常代码
  • Exception::getFile — 获取发生异常的程序文件名称
  • Exception::getLine — 获取发生异常的代码在文件中的行号
  • Exception::getTrace — 获取异常追踪信息
  • Exception::getTraceAsString — 获取字符串类型的异常追踪信息
  • Exception::__toString — 将异常对象转换为字符串
  • Exception::__clone — 异常克隆
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的设置进行错误报告或记录。

转载于:https://my.oschina.net/bluefly/blog/522358

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值