PHP 错误与异常 笔记与总结(12 )异常
① 异常的概念;异常和错误的区别
PHP 部分借鉴了 C++ 和 JAVA 中的异常处理机制。PHP 中的异常是指 程序运行和预期不太一致,与错误是两个不同的概念。
② 异常的语法结构
【例1】
1 <?php 2 header('content-type:text/html; charset=utf-8'); 3 /* 4 try{ 5 要测试的代码段; 6 throw new Exception('异常信息'); 7 }catch(Exception $e){ 8 echo $e->getMessage(); 9 } 10 */ 11 //显示所有错误 12 error_reporting(-1); 13 try{ 14 $num1 = 1; 15 $num2 = 2; 16 if( 2 == $num2 ){ 17 //抛出异常 18 throw new Exception('0不能当作除数'); 19 }else{ 20 $num = $num1 / $num2; 21 } 22 }catch(Exception $e){ //捕获异常 23 echo $e->getMessage(); 24 } 25 echo 'continue';
捕获异常的前提是要 手动抛出异常(throw new Exception())。
页面输出:
0不能当作除数continue
语法结构:把需要测试的代码放到 try 代码段中,然后通过 catch 来捕获异常(可以在 catch 代码段中进行操作,例如输出异常信息);在 try 代码段的 throw 语句之后的代码不会被执行。当异常抛出后,立即寻找第一个与之匹配的捕获到的异常。
【例2】在使用 PDO 异常处理类时,不需要手动抛出异常即可捕获异常,例如当数据库密码错误时,系统会自动捕获异常(使用了内置异常类):
1 <?php 2 try{ 3 $pdo = new Pdo('mysql:host = localhost; dbname = test', 'root', '123'); 4 var_dump($pdo); 5 }catch(PDOException $e){ 6 echo $e->getMessage(); 7 } 8 echo 'continue';
页面输出:
SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: YES)continue
【例3】再例如 SPL(Standard PHP Library(PHP标准库),可以参考《PHP SPL笔记》)的异常处理,同样不需要手动抛出异常(使用了内置异常类):
<?php try{ $splObj = new SPLFileObject('test.txt', 'r');//以“读”的方式打开test.txt(不存在) echo 'read file'; }catch(Exception $e){ echo $e->getMessage(); } echo 'continue';
页面输出:
SplFileObject::__construct(test.txt) [splfileobject.--construct]: failed to open stream: No such file or directorycontinue
③ 自定义异常类
④ 自定义异常处理器
⑤ 如何像处理异常一样处理 PHP 中的错误
⑥ 在发生错误的时候将用户重定向到另一个页面