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

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

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

一、异常处理概念 app

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 />";
}

?>


二、Exception类 函数

Exception

(PHP 5 >= 5.1.0) this

简介

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

异常消息内容 spa

code

异常代码 .net

file

抛出异常的文件名 code

line

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

Table of Contents

三、用户自定义异常
用户能够扩展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;
}

?>

四、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>";
}

五、异常与PHP其余错误处理机制
PHP还提供了复杂的错误处理机制,注意,好比异常处理和@错误抑制并不会影响。
例子:
 if (!($fp =  @fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'ab')))
       throw new fileOpenException();
若是该函数调用失败,PHP将发出一个浸膏,根据php.ini的设置进行错误报告或记录。
相关文章
相关标签/搜索