要使用异常,首先得知道那些部分会产生异常,产生什么类型异常(php常见异常见下方符表),对产生的异常该怎么办。
如果知道程序的那些部分会产生异常,那么就对这一部分使用try关键字;
如果知道了产生异常的部分产生的是什么类型的异常,那么就可以使用throw关键字抛出这个异常类的实例,要是不知道是什么类型的异常,那就用基类Exception。
当知道了程序会产生什么类型的异常,也抛出了异常,最后就可以使用catch关键字捕获并处理异常。
首先用面向对象的方法来实现上面的思路。
这里捕捉的是PDO类异常:
1 <?php 2 try{ 3 $dsn = ‘mysql:127.0.0.1;db_name=user‘; 4 $pdo = new PDO( $dsn, ‘roo‘, ‘root‘ ); 5 // 自己写的代码不需要抛出PDO异常实例 6 }catch( PDOException $e ){ 7 // 获得异常信息 8 echo ‘异常信息:‘.$e ->getMessage().PHP_EOL, 9 ‘异常编号:‘.$e ->getCode().PHP_EOL, 10 ‘异常行号:‘.$e ->getLine().PHP_EOL, 11 ‘异常文件:‘.$e ->getFile().PHP_EOL; 12 }
异常信息:SQLSTATE[HY000] [1045] Access denied for user ‘roo‘@‘localhost‘ (using password: YES) 异常编号:1045 异常行号:4 异常文件:D:\workspace\project_shop\test.php
使用所有异常类的基类,Exception类。
1 <?php 2 try{ 3 $a; 4 throw new Exception( ‘变量没有定义!‘, 250 ); 5 }catch( Exception $e ){ 6 // 处理异常 7 echo ‘异常信息:‘.$e ->getMessage().PHP_EOL, 8 ‘异常编号:‘.$e ->getCode().PHP_EOL, 9 ‘异常行号:‘.$e ->getLine().PHP_EOL, 10 ‘异常文件:‘.$e ->getFile().PHP_EOL; 11 }
异常信息:变量没有定义! 异常编号:250 异常行号:4 异常文件:D:\workspace\project_shop\test.php
自定义异常类,MyException类
1 <?php 2 class MyException1 extends Exception { 3 public function show_exception_info(){ 4 echo ‘异常信息:‘.$this ->getMessage().PHP_EOL, 5 ‘异常编号:‘.$this ->getCode().PHP_EOL, 6 ‘异常行号:‘.$this ->getLine().PHP_EOL, 7 ‘异常文件:‘.$this ->getFile().PHP_EOL; 8 } 9 } 10 class MyException2 extends Exception { 11 public function show_exception_info(){ 12 echo ‘异常信息:‘.$this ->getMessage().PHP_EOL, 13 ‘异常编号:‘.$this ->getCode().PHP_EOL, 14 ‘异常行号:‘.$this ->getLine().PHP_EOL, 15 ‘异常文件:‘.$this ->getFile().PHP_EOL; 16 } 17 } 18 class MyException3 extends Exception { 19 public function show_exception_info(){ 20 echo ‘异常信息:‘.$this ->getMessage().PHP_EOL, 21 ‘异常编号:‘.$this ->getCode().PHP_EOL, 22 ‘异常行号:‘.$this ->getLine().PHP_EOL, 23 ‘异常文件:‘.$this ->getFile().PHP_EOL; 24 } 25 } 26 try{ 27 $a = 2; 28 switch( true ){ 29 case $a > 3: 30 throw new MyException3( ‘变量大于3,超载!‘, 253 ); 31 break; 32 case $a > 2: 33 throw new MyException2( ‘变量大于2,超载!‘, 252 ); 34 break; 35 default: 36 throw new MyException1( ‘变量没有定义!‘, 250 ); 37 break; 38 } 39 40 }catch( MyException3 $e ){ 41 // 处理异常 42 $e ->show_exception_info(); 43 }catch( MyException2 $e ){ 44 // 处理异常 45 $e ->show_exception_info(); 46 }catch( MyException1 $e ){ 47 // 处理异常 48 $e ->show_exception_info(); 49 }finally{ 50 echo ‘最终我还是执行了!‘; 51 }
虽然上面提到需要用catch捕获异常,但下面的就不用:
1 function show_exception_info( $e ){ 2 echo ‘异常信息:‘.$e ->getMessage().PHP_EOL, 3 ‘异常编号:‘.$e ->getCode().PHP_EOL, 4 ‘异常行号:‘.$e ->getLine().PHP_EOL, 5 ‘异常文件:‘.$e ->getFile().PHP_EOL; 6 } 7 set_exception_handler( ‘show_exception_info‘ ); 8 throw new Exception( ‘异常信息传过去!‘, 22222 );
异常信息:异常信息传过去! 异常编号:22222 异常行号:9 异常文件:D:\workspace\project_shop\test.php
原文:https://www.cnblogs.com/zxcv123/p/11794698.html