和PHP默认的异常处理不同,ThinkPHP抛出的不是单纯的错误信息,而是一个人性化的错误页面,如下图所示:
只有在调试模式下面才能显示具体的错误信息,如果在部署模式下面,你可能看到的是一个统一错误的提示文字,如果你试图在部署模式下访问一个不存在的模块或者操作,会发送404错误。
调试模式下面一旦系统发生严重错误会自动抛出异常,也可以用ThinkPHP定义的throw_exception方法手动抛出异常。
throw_exception 抛出异常 | |
---|---|
用法 | throw_exception($msg, $type='ThinkException', $code=0) |
参数 | msg(必须):要抛出的异常信息,字符串 type(可选):异常类型,默认为ThinkException,如果异常类型不存在,则会调用系统的halt方法直接输出错误信息。 code(可选):异常代码,默认为0 |
返回值 | 无 |
下面是throw_exception函数的一些使用例子:
throw_exception('新增失败'); throw_exception('信息录入错误','InfoException');
同样也可以使用throw 关键字来抛出异常,下面的写法是等效的:
throw new ThinkException('新增失败'); throw new InfoException('信息录入错误');
如果需要,我们建议在项目的类库目录下面增加Exception目录用于专门存放异常类库,以更加精确地定位异常。
Exception类需继承自ThinkException,如:
abstract class CommonException extends ThinkException
在其他文件用的时候可以这样用:
try { $redisObj = D('Redis.RdUserfav'); $redisObj->clearUserCacheVersion($uid, C('CACHE_VERSION_ME')); $redisObj->clearUserCacheVersion($uid, C('CACHE_VERSION_PRICEDOWN')); } catch (RedisConnException $e) { //do nothing. }
这样可以在连接Redis失败时,不做任何操作
如果你要捕获通用的exception,同时又要捕获其他自定义的异常,必须把自定义的异常放在前面
1、基本语法
try{
//可能出现错误或异常的代码
//catch 捕获 Exception是php已定义好的异常类
} catch(Exception $e){
//对异常处理,方法:
//1、自己处理
//2、不处理,将其再次抛出
}
2、处理处理程序应当包括:
- Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
- Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
- Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象
<?php //创建可抛出一个异常的函数 function checkNum($number){ if($number>1){ throw new Exception("Value must be 1 or below"); } return true; } //在 "try" 代码块中触发异常 try{ checkNum(2); //如果异常被抛出,那么下面一行代码将不会被输出 echo 'If you see this, the number is 1 or below'; }catch(Exception $e){ //捕获异常 echo 'Message: ' .$e->getMessage(); } ?>