bezrukovPS
@bezrukovPS
Ведущий программист 1С-Битрикс

Yii2 как правильно обработать исключение?

Добрый день.

Как правильно обрабатывать исключения, например \SoapFault, чтобы работа приложения продолжила работать как будто ничего не произошло?

Я так понимаю сейчас в методе yii\base\ErrorHandler::register() ставятся обработчики ошибок, что и приводит к нежелательным результатам.
В качестве костыля я нашёл такое решение, причём работает только для контроллера наследника \yii\web\Controller, для yii\console\Controller исключения не удалось предотвратить вообще никак. В общем мне это совсем не нравится, что-то я упускаю совсем очевидное.
try {
			Yii::$app->errorHandler->unregister();
			$this->_soapClient = new \SoapClient($this->wsdl,
				array(
					'trace' => 1,
					'exceptions' => 1,
					'encoding' => 'UTF-8',
					'passphrase' => ''
				)
			);
		}
		catch(\SoapFault $e) {
			Yii::$app->errorHandler->exception->type = null;
			Yii::$app->errorHandler->register();
		}


Как вариант я вижу, детально продебажить работу этого компонента, наследовать его и придумать свой выход из ситуации, но я уверен что такая типовая задача должна решаться как-то намного проще и изящней. Да и нужно это в 1м поведении, а не во всём приложении.
  • Вопрос задан
  • 9862 просмотра
Пригласить эксперта
Ответы на вопрос 2
fornit1917
@fornit1917
При чем тут ErrorHandler? ErrorHandler срабатывает только на те исключения, которые вы сами не поймали в try..catch.
Если вы обрабатываете исключение, вы можете обеспечить продолжение работы приложения, как будто ничего не произошло.
Вот пример:

try {
  throw new \Exception('Error!');
} catch (\Exception $ex) {
}

//...Можно продолжать работу приложения, как будто не было никаких исключений
Ответ написан
Isolution666
@Isolution666
Full-Stack Developer
Напишите функцию.
...
use yii\base\ViewNotFoundException;
...
try {
    // 1) тут пишите то что хотите проверить
} catch (ViewNotFoundException $e) {
    // 2) тут выводите "удобную" ошибку, чтобы не закрывать ошибкой 500 или той которая вылезает
}

В данном случае проверяется путь на существование файла, если его нет, то вернёт комментарий "2)"
то есть, если вам досаждает ошибка ErrorHandler пишите и юзаете её в catch и так далее, смотря что мешает работать странице. Это решение подойдёт тем у кого закрывается ошибкой вся страница, а не её фрагмент. Так устроен Yii, чтобы чуть что,вы наверняка увидели что у вас что-то не так работает.
Успехов вам.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы