YII2 的错误处理逻辑

Yii在base\Application中的run方法里面只捕获了ExitException异常

在web\Application中的handleRequest方法中只捕获了InvalidRouteException异常

在控制器的runAction方法中也没有捕获异常

 

Yii的异常捕获和错误处理是通过set_exception_handler和set_error_handler来注册异常捕获和错误捕获来处理的,具体是在ErrorHandler中进行的

可以通过定义常量YII_ENABLE_ERROR_HANDLER(默认true)来指示是否启用错误和异常捕获的功能

在base\ErrorHandler中,捕获的错误最终都会转换为ErrorException异常进行异常处理,最后通过renderException方法输出异常

 

在yii\web\ErrorHandler中的renderException方法,跟情况有四种方式输出异常:

  1. 通过ErrorHandler中配置的errorAction输出异常
    条件:响应类型是html,并且设置了errorAction,并且(YII_DEBUG为false,或者异常类是UserException)

  2. 简单的显示错误信息
    不符合以上条件,并且响应类型是html时使用这种方式,并且还分两种情况,显示简单的错误信息还是显示完整的异常信息
    a) 当YII_ENV_TEST为true或者是ajax请求时,直接输出用pre标签包裹的用convertExceptionToString转换之后的字符串
    b) 然后就是通过错误模板来渲染
  3. 将异常信息通过convertExceptionToString方法转换为字符串输出
    不符合以上条件,并且响应类型是raw时使用这种方式
  4. 将异常信息通过convertExceptionToArray方法转换为数组输出
    不符合以上条件的使用这种方式