🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 概述 程序运行与预期不太一致,与错误是两个不同的概念 . ### 语法 每一个try都需要对应一个catch或者多个catch代码块 ,用来捕获不同类产生的异常 . 如果try代码块没有找到异常PHP将会跳过catch代码块进行下面的程序运行 . 如果有一个异常被抛出的话,throw里面的代码就不会被执行了 . ~~~ try{ 需要进行异常处理的代码段; }catch(Exception $e){ ... }catch(Exception $e){ ... }catch(Exception $e){ ... } ~~~ ### 经典除零案例 ~~~ $num = null; try{ $num = 3 / 0; var_dump($num); } catch(Exception $e){ echo $e->getMessage(); } echo 'continue...'; ~~~ 结果 ~~~ Warning: Division by zero in C:\Users\Artisan\Desktop\project\Test\index.php on line 5 float(INF) continue... ~~~ 程序并没有跑到catch段中 . 当我们遇到0当除数的时候,这触发了PHP中本身的一个错误,而没有走到catch段中, 反而产生了一个警告 .**也就是说PHP首先触发的是错误,而不会自动的抛出异常** . 在PHP中必须手动,主动的通过throw抛出异常才可以 . ### 通过throw抛出异常 ~~~ $num1 = 3; $num2 = 0; try{ if($num2 == 0){ throw new Exception("0不能当做除数"); //throw之后的代码不会被执行 echo "这里不会被执行"; }else{ $result = $num1 / $num2; } } catch(Exception $e){ echo $e->getMessage(); //之后可以通过die()或者return 来停止程序 . } echo 'continue...'; ~~~ ~~~ 0不能当做除数 continue... ~~~ PHP的异常和其他语言不太一样, 在Java中它认为除0就是异常,它就会捕获,并进行处理 . PHP的异常机制还不太完善 . ### PHP内置异常类 PHP也内置了一些异常类, 也可以不通过throw的方式去抛出异常 .比PDO异常类 . ~~~ try{ $pdo = new PDO("mysql:host=localhost;dnname=mysql",'root','xxxx');//这里并没有手动throw }catch(Exception $e){ echo $e->getMessage(); } ~~~ 结果 ~~~ SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) ~~~ ### 错误和异常的区别 当遇到错误的时候,PHP会主动的触发错误,而不会主动的抛出异常 . 只有他通过throw语句来抛出异常, 然后通过catch来捕获异常 . 在PHP中错误已经很有用了,但是错误和异常还是有区别的 . 首先,他们是两个不同的机制 . 错误是没有办法在调用的时候向上传递的 ,因为错误必须马上进行处理 .而异常会一一向上传递,直到我们去捕获 . 在发生错误的时候,我们必须要对我们的错误脚本进行处理 ,而异常可以自定义的来处理异常错误信息. 如果没有错误消息,我们很难确定程序哪里出现了哪些问题 ,因为我们触发的任何错误都不具有相关的错误代码或者名称 . 这时候异常的好处就体现出来了,因为异常都是通过代码来抛出,接着通过代码向上传递,直到我们通过代码来捕获异常信息 .