PHP学习笔记7:错误和异常处理
博客专区 > slyso 的博客 > 博客详情
PHP学习笔记7:错误和异常处理
slyso 发表于2年前
PHP学习笔记7:错误和异常处理
  • 发表于 2年前
  • 阅读 514
  • 收藏 2
  • 点赞 0
  • 评论 0

腾讯云 学生专属云服务套餐 10元起购>>>   

摘要: 读《PHP和MySQL Web开发》,一些自己感觉基础、重要但容易忘的摘记。笔者有一定的C、Python语言基础,所以学习PHP时的笔记仅供参考。

读《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

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的设置进行错误报告或记录。
共有 人打赏支持
粉丝 23
博文 28
码字总数 52229
×
slyso
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: