error occurs while throwing NotFoundException

I have a simple code that is running on beforeAction event of my application:




'on beforeAction' => function ($event) {

    throw new \yii\web\NotFoundHttpException('The requested page does not exist.');

},



I expect it to simply show 404 page of my application, but it throws following error:




An Error occurred while handling another error:

exception 'yii\web\NotFoundHttpException' with message 'The requested page does not exist.' in /home/files/www/ucms/config/frontend/config.php:9

Stack trace:

#0 [internal function]: {closure}(Object(yii\base\ActionEvent))

#1 /home/files/www/ucms/vendor/yiisoft/yii2/base/Component.php(541): call_user_func(Object(Closure), Object(yii\base\ActionEvent))

#2 /home/files/www/ucms/vendor/yiisoft/yii2/base/Module.php(607): yii\base\Component->trigger('beforeAction', Object(yii\base\ActionEvent))

#3 /home/files/www/ucms/vendor/yiisoft/yii2/base/Controller.php(139): yii\base\Module->beforeAction(Object(yii\web\ErrorAction))

#4 /home/files/www/ucms/vendor/yiisoft/yii2/base/Module.php(455): yii\base\Controller->runAction('error', Array)

#5 /home/files/www/ucms/vendor/yiisoft/yii2/web/ErrorHandler.php(85): yii\base\Module->runAction('site/error')

#6 /home/files/www/ucms/vendor/yiisoft/yii2/base/ErrorHandler.php(109): yii\web\ErrorHandler->renderException(Object(yii\web\NotFoundHttpException))

#7 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\web\NotFoundHttpException))

#8 {main}

Previous exception:

exception 'yii\web\NotFoundHttpException' with message 'The requested page does not exist.' in /home/files/www/ucms/config/frontend/config.php:9

Stack trace:

#0 [internal function]: {closure}(Object(yii\base\ActionEvent))

#1 /home/files/www/ucms/vendor/yiisoft/yii2/base/Component.php(541): call_user_func(Object(Closure), Object(yii\base\ActionEvent))

#2 /home/files/www/ucms/vendor/yiisoft/yii2/base/Module.php(607): yii\base\Component->trigger('beforeAction', Object(yii\base\ActionEvent))

#3 /home/files/www/ucms/vendor/yiisoft/yii2/base/Controller.php(139): yii\base\Module->beforeAction(Object(yii\base\InlineAction))

#4 /home/files/www/ucms/vendor/yiisoft/yii2/base/Module.php(455): yii\base\Controller->runAction('', Array)

#5 /home/files/www/ucms/vendor/yiisoft/yii2/web/Application.php(84): yii\base\Module->runAction('', Array)

#6 /home/files/www/ucms/vendor/yiisoft/yii2/base/Application.php(375): yii\web\Application->handleRequest(Object(yii\web\Request))

#7 /home/files/www/ucms/web/index.php(17): yii\base\Application->run()

#8 {main}



Hello Hesam.

Try this




'on beforeAction' => function ($event) {

    throw new throw new NotFoundHttpException('The requested page does not exist.');

},

Well that actually made it worse, syntax error happens!

Thanks to guys in stack overflow, I found the problem. It’s like a recursion here, system tries to run error action but error action also calls on beforeAction event, and again another NotFoundException is thrown there.

You may find the solution here: my Stack Overflow question

You must add ‘error’ on actions

'rules' => [
               [
                  'actions' => ['error', ...
'on beforeAction' => function ($event) {
      if ($event->action->controller->action->id != 'error' ) {
     	  throw new \yii\web\NotFoundHttpException('The requested page does not exist.');
      }
}