За последние 24 часа нас посетили 22609 программистов и 1193 робота. Сейчас ищут 735 программистов ...

Использование try-catch-finally

Тема в разделе "PHP для новичков", создана пользователем Вероломство, 14 дек 2020.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    Как делаю я:
    PHP:
    1. <?php
    2.  
    3.  
    4. namespace app\controllers;
    5.  
    6.  
    7. use app\models\User;
    8. use core\App;
    9.  
    10. class UserController extends AppController
    11. {
    12.     public function forgotAction()
    13.     {
    14.         try {
    15.             $this->guestArea();
    16.             if ($this->formButton('forgot')) {
    17.                 $email = filter_input(INPUT_POST, 'fotgot');
    18.                 $new_password = $this->generateRandomString(30);
    19.                 $user = User::forgot($email, $new_password);
    20.                 if ($user) {
    21.                     $this->sendMail($user->email, 'Новый пароль: ' . $new_password);
    22.                     $this->alert('success', 'Новый пароль выслан на email аккаунта');
    23.                     $this->redirectToPage('/');
    24.                 }
    25.             }
    26.         } catch (App $app) {
    27.             $this->alert('danger', $app->getMessage()); // отлуп из User::forgot() - throw new App('Вы не ввели или неправильно ввели данные');
    28.         } finally {
    29.             $this->setTitle('Восстановление пароля');
    30.         }
    31.     }
    32. }
    А как должно быть? Как и где нужно расположить try-catch (finally), если пользовательский выброс происходить только в User::forgot(...), почему нужно обрамлять весь код (просто по другому у меня не работает, если я только метод модели помещаю в ловушку)?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    А ты бросаешь исключение типа App?
     
  3. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    да, я там прокомментировал (App реализует Throwable, расширяясь от Error), мне интересно: почему весь код нужно заворачивать в отлов?

    отлов тратит ресурсы на поиск исключений в остальном коде внутри него, который не имеет пользовательских выбросов?

    какой смысл тогда его держать там?

    :)
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @Вероломство Нафиг не нужно всё заключать в try, это ты не там ошибку ищешь. Нужно только то, что бросается исключениями
     
    Вероломство нравится это.
  5. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    в данном случае так не получится, потому что вот такие вилы вылезают

    PHP:
    1. public function forgotAction()
    2. {
    3.     $this->guestArea();
    4.     if ($this->formButton('forgot')) {
    5.         $email = filter_input(INPUT_POST, 'email');
    6.         $new_password = $this->generateRandomString(10);
    7.         try {
    8.             $user = User::forgot($email, $new_password);
    9.         } catch (App $app) {
    10.             $this->alert('danger', $app->getMessage());
    11.         }
    12.         if ($user) { // Undefined variable: user
    13.             $this->sendMail($user->email, 'Новый пароль: ' . $new_password);
    14.             $this->redirectToPage();
    15.         }
    16.     }
    17.     $this->setTitle('Восстановление пароля');
    18. }
    в комментарии указана ошибка :)

    оставил как было
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну так если блок catch обработал ошибку, то дальше программа выполняется, если он при обработке её явно не завершил, так что всё логично.
     
    Вероломство нравится это.