PHP пытается / перехватить пользовательское исключение, переопределенное catch

#php #exception #try-catch #overriding

Вопрос:

Предполагая следующий код

 use GuzzleHttpExceptionTransferException;
use GuzzleHttpExceptionClientException;
use GuzzleHttpExceptionServerException;


try{
    $response = $client->request('POST', '/api', [
        'json' => [
            'method'    => 'xyz',
        ]
    ]);

    $rpcResult = json_decode($response->getBody());
    if(isset($rpcResult->error))
        throw new AppExceptionsAPIExeption('error in sending api command ' . $rpcResult->error);

    return $rpcResult->resu<
}

catch(ClientException | ServerException $e){

    throw new AppExceptionsAPIExeption('error in sending api command ' . $e->getResponse()->getreasonPhrase() . " " . $e->getResponse()->getstatusCode());

}

catch(ConnectException $e){

    throw new AppExceptionsAPIExeption('error in sending api command ' . $e->gethandlerContext()['error']);
}

//general
catch(Exception $e){

    throw new AppExceptionsAPIExeption('error in sending api command (general)');
}
 

Всякий раз, когда сам API возвращает ошибку, должно возникать следующее пользовательское исключение:

 throw new AppExceptionsAPIExeption('error in sending api command ' . $rpcResult->error);
 

По какой-то причине всякий раз, когда возникает это исключение, также вызывается общий блок catch, что означает, что он каким-то образом «переопределяет» мое пользовательское исключение сверху.

Есть идеи, как я могу это предотвратить?

Комментарии:

1. Вероятно, это потому APIExeption , что расширяется Exception . Как это предотвратить? Не используйте исключения для рабочего процесса ваших программ.

2. Да, это расширяет исключение, но как заставить это работать в потоке моих текущих программ?

3. Тогда не ловите исключение.

4. Поймайте AppExceptionsAPIExeption и сделайте с ним что-нибудь, даже если это означает, что вы снова бросите его throw $e , чтобы вырваться из вашей попытки поймать

Ответ №1:

Если вы хотите, чтобы ваше исключение всплывало за пределами блока try catch, поместите это в первую очередь.

ваш бросок исключения находится в пределах вашего блока try catch

 catch( AppExceptionsAPIExeption $e ){
    throw $e;
}
 

или удалите свое «общее» заявление о улове