Как делаю я: PHP: <?php namespace app\controllers; use app\models\User; use core\App; class UserController extends AppController { public function forgotAction() { try { $this->guestArea(); if ($this->formButton('forgot')) { $email = filter_input(INPUT_POST, 'fotgot'); $new_password = $this->generateRandomString(30); $user = User::forgot($email, $new_password); if ($user) { $this->sendMail($user->email, 'Новый пароль: ' . $new_password); $this->alert('success', 'Новый пароль выслан на email аккаунта'); $this->redirectToPage('/'); } } } catch (App $app) { $this->alert('danger', $app->getMessage()); // отлуп из User::forgot() - throw new App('Вы не ввели или неправильно ввели данные'); } finally { $this->setTitle('Восстановление пароля'); } } } А как должно быть? Как и где нужно расположить try-catch (finally), если пользовательский выброс происходить только в User::forgot(...), почему нужно обрамлять весь код (просто по другому у меня не работает, если я только метод модели помещаю в ловушку)?
да, я там прокомментировал (App реализует Throwable, расширяясь от Error), мне интересно: почему весь код нужно заворачивать в отлов? отлов тратит ресурсы на поиск исключений в остальном коде внутри него, который не имеет пользовательских выбросов? какой смысл тогда его держать там?
@Вероломство Нафиг не нужно всё заключать в try, это ты не там ошибку ищешь. Нужно только то, что бросается исключениями
в данном случае так не получится, потому что вот такие вилы вылезают PHP: public function forgotAction() { $this->guestArea(); if ($this->formButton('forgot')) { $email = filter_input(INPUT_POST, 'email'); $new_password = $this->generateRandomString(10); try { $user = User::forgot($email, $new_password); } catch (App $app) { $this->alert('danger', $app->getMessage()); } if ($user) { // Undefined variable: user $this->sendMail($user->email, 'Новый пароль: ' . $new_password); $this->redirectToPage(); } } $this->setTitle('Восстановление пароля'); } в комментарии указана ошибка оставил как было
Ну так если блок catch обработал ошибку, то дальше программа выполняется, если он при обработке её явно не завершил, так что всё логично.