flapflapjack
@flapflapjack
Нажимательщик кнопков

Почему я не могу использовать try и catch в разных частях кода?

Много где пишут, что правильно вообще генерировать исключения в одном месте,

А обрабатывать их уже в отдельном месте, например где-нибудь в конце.

Ну, дай думаю, проверю?

<?php
$bd_type="mysql";
$db_name="вфвфф";
$db_host="ываыва;
$db_user="вввв";
$db_pass="жужужжу";
$db_charset="utf8234222";

$pdo_opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];

$DSN="$bd_type:db_name=$db_name;host=$db_host;charset=$db_charset";
try {
        $db=new PDO($DSN, $db_user, $db_pass, $pdo_opt);

                if(!$db){throw new Exception("PDO не может коннектиться к $db_name");}
}

?>
бла бля бла
<?

catch(Exception $ex) {echo $ex->getMessage();die();}

?>


И что же я вижу ? страничка не открывается, а в логах:

PHP Parse error: syntax error, unexpected 'catch' (T_CATCH), expecting end of file in /var/www/


Если между try и catch убрать "бла бла бла", то скрипт отрабатывает.

Что же тогда имеется ввиду под советами "
обрабатывать их уже в отдельном месте, например где-нибудь в конце"


?
я не понимать
  • Вопрос задан
  • 102 просмотра
Решения вопроса 3
Во-первых, у вас тут не хватает кавычки
$bd_type="mysql";
$db_name="вфвфф";
$db_host="ываыва;
$db_user="вввв";
$db_pass="жужужжу";
$db_charset="utf8234222";


А во-вторых, try..catch - это именно обработка исключения, а генерирование исключения делается с помощью throw.

Использовать try и catch раздельно невозможно, т.к. это две части одной конструкции. Обрабатывать исключения нужно так:
function testException()
{
   throw new Exception('Что-то тут не так'); // Генерируем исключение
}

try {
   testException();
} catch (Exception $e) {
   // Обрабатываем его
  echo $e->getMessage(), PHP_EOL;
}
Ответ написан
@FanatPHP
Если не обращать внимание на дурацкий пример (PDO прекрксно без твоей помощи справится с выбросом исключения, и echo $ex->getMessage();die(); - это полная бессмыслица, поскольку пхп опять же выведет сообщение об ошибке без твоей помощи) то ты просто не туда поставил закрывающую скобку. она должна быть перед catch
try {
        $db=new PDO($DSN, $db_user, $db_pass, $pdo_opt);

?>
бла блa бла
<?

} catch(Exception $ex) {
    обработка исключения
}

В общем, оставь пока исключения в покое, тебе не надо их ни бросать, ни ловить.
Ответ написан
syamskoy
@syamskoy
"В конце" - скорей всего имелось ввиду, что где-то в ебенях проекта у тебя сервис выкидывает эксепшен типа throw new UserNotFoundException('Something error text'); а ближе к выводу пользователю уже ловишь и обрабатываешь, например в контроллере:
try {
    $this->loginService->login($login, $password);
 } catch(UserNotFoundException $ex) {
    return ['message' => 'Invalid credential'];
 }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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