小白教程

 找回密码
 立即注册
小白教程 首页 系列教程 PHP系列教程 查看内容

PHP 异常处理

发布者: 小白教程

异常指的是程序在运行中出现不符合预期的情况,允许发生,但属于一种不正常的情况,是本不该出现但仍出现的错误,属于逻辑和业务流程的错误,而不是编译或者语法上的错误。

异常用于在指定的错误发生时改变脚本的正常流程。


异常是什么

PHP 5 提供了一种新的面向对象的错误处理方法。

异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。

当异常被触发时,通常会发生:

  • 当前代码状态被保存
  • 代码执行被切换到预定义(自定义)的异常处理器函数
  • 根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本

我们将展示不同的错误处理方法:

  • 异常的基本使用
  • 创建自定义的异常处理器
  • 多个异常
  • 重新抛出异常
  • 设置顶层异常处理器

注释:异常应该仅仅在错误情况下使用,而不应该用于在一个指定的点跳转到代码的另一个位置。


异常的基本使用

当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块。

如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。

让我们尝试抛出一个异常,同时不去捕获它:

  1. <?php
  2. //create function with an exception
  3. function checkNum($number)
  4. {
  5. if($number>1)
  6. {
  7. throw new Exception("Value must be 1 or below");
  8. }
  9. return true;
  10. }
  11. //trigger exception
  12. checkNum(2);
  13. ?>

上面的代码会得到类似这样的一个错误:

Fatal error: Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:webfoldertest.php:6
Stack trace: #0 C:webfoldertest.php(12):
checkNum(28) #1 {main} thrown in C:webfoldertest.php on line 6

Try、throw 和 catch

要避免上面实例中出现的错误,我们需要创建适当的代码来处理异常。

适当的处理异常代码应该包括:

  1. Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  2. Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
  3. Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。

让我们触发一个异常:

  1. <?php
  2. //create function with an exception
  3. function checkNum($number)
  4. {
  5. if($number>1)
  6. {
  7. throw new Exception("Value must be 1 or below");
  8. }
  9. return true;
  10. }
  11. //trigger exception in a "try" block
  12. try
  13. {
  14. checkNum(2);
  15. //If the exception is thrown, this text will not be shown
  16. echo 'If you see this, the number is 1 or below';
  17. }
  18. //catch exception
  19. catch(Exception $e)
  20. {
  21. echo 'Message: ' .$e->getMessage();
  22. }
  23. ?>

上面代码将得到类似这样一个错误:

Message: Value must be 1 or below

实例解释:

上面的代码抛出了一个异常,并捕获了它:

  1. 创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
  2. 在 "try" 代码块中调用 checkNum() 函数。
  3. checkNum() 函数中的异常被抛出。
  4. "catch" 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
  5. 通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息。

然而,为了遵循 "每个 throw 必须对应一个 catch" 的原则,可以设置一个顶层的异常处理器来处理漏掉的错误。


创建一个自定义的 Exception 类

创建自定义的异常处理程序非常简单。我们简单地创建了一个专门的类,当 PHP 中发生异常时,可调用其函数。该类必须是 exception 类的一个扩展。

这个自定义的 exception 类继承了 PHP 的 exception 类的所有属性,您可向其添加自定义的函数。

我们开始创建 exception 类:

  1. <?php
  2. class customException extends Exception
  3. {
  4. public function errorMessage()
  5. {
  6. //error message
  7. $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
  8. .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
  9. return $errorMsg;
  10. }
  11. }
  12. $email = "someone@example...com";
  13. try
  14. {
  15. //check if
  16. if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  17. {
  18. //throw exception if email is not valid
  19. throw new customException($email);
  20. }
  21. }
  22. catch (customException $e)
  23. {
  24. //display custom message
  25. echo $e->errorMessage();
  26. }
  27. ?>

这个新的类是旧的 exception 类的副本,外加 errorMessage() 函数。正因为它是旧类的副本,因此它从旧类继承了属性和方法,我们可以使用 exception 类的方法,比如 getLine()、getFile() 和 getMessage()。


12下一页
上一篇:PHP 错误处理下一篇:PHP 过滤器

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-9-19 12:13 , Processed in 0.023303 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

返回顶部