#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;
}
или удалите свое «общее» заявление о улове