Как переопределить класс исключения и не отображать фатальную ошибку

Я пытаюсь написать класс, который взаимодействует с API. Я хотел бы переопределить стандартный класс исключения в PHP, чтобы вернуть сообщение, код ошибки, который я хочу.

Я добавил это расширение

<?php namespace API;

/**
* API Exception
*
* @package ICWS
*/
class ApiException extends \Exception
{
public function __construct($message, $code = 0)
{
// Custom ICWS API Exception Message
$apiMessage = 'ICWS API Error: ' . $message;

//More code to come to custom the error message/code.....

// Run parent construct using custom message
parent::__construct($apiMessage, $code);
}
}
?>

Затем при необходимости я создаю новую ApiException, как это

    throw new ApiException($errorMessage, $errorNo);

Наконец, я обертываю функцию, которая выдает исключение try{} catch() блок для захвата исключения.

Тем не менее, я все еще получаю fatal error а не просто сообщение, которое я предоставил.

Вот мой код

public function createSession($userID, $password){

$data = array('userID' => $userID,
'password' => $password);

try {

$data = $this->_makeCall('POST', 'connection', $data);

$this->_csrfToken = $data['csrfToken'];
$this->_sessionId = $data['sessionId'];
$this->_alternateHostList = $data['alternateHostList'];

} catch (Exception $e){
$this->_displayError($e);
}
}

private function _makeCall($uri, $data = false, $header = array())
{
$ch = curl_init();
$url = $this->_baseURL . $uri;

//disable the use of cached connection
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);

curl_setopt($ch, CURLOPT_URL, $url);

//return the respond from the API
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

if(!empty($header)){
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}

curl_setopt($ch, CURLOPT_POST, true);

if ($data){
$JSON = json_encode( $data );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $JSON );
}$result = curl_exec($ch);

//throw cURL exception
if($result === false){
$errorNo = curl_errno($ch);
$errorMessage = curl_error($ch);

throw new ApiException($errorMessage, $errorNo);
}

$result = json_decode($result, true);

//throw API exception
if(  $this->_hasAPIError($result) )
){
throw new ApiException($result['message'], 0);
}

return $result;
}

private function _displayError(Exception $e){
echo 'Error Number: ' . $e->getCode() . "\n";
echo 'Error Description: ' . $e->getMessage() . "\n\n";
}

private function _hasAPIError($result){
if(    isset($result['errorId']) && !empty($result['errorId'])
&& isset($result['errorCode']) && !empty($result['errorCode'])
&& isset($result['message']) && !empty($result['message'])
){
return true;
}

return false;
}

Я хотел бы видеть что-то вроде этого в конце «если есть ошибка»

Error Number: 0
Error Description: ICWS API Error: The authentication process failed

Это то, что я сейчас получаю

Fatal error: Uncaught exception 'API\ApiException' with message 'ICWS API Error: The authentication process failed.' in C:\phpsites\icws\API\ICWS.php:130 Stack trace: #0 C:\phpsites\icws\API\ICWS.php(57): API\ICWS->_makeCall('connection', Array) #1 C:\phpsites\icws\index.php(17): API\ICWS->createSession('user', 'pass') #2 {main} thrown in C:\phpsites\icws\API\ICWS.php on line 130

1

Решение

Ошибка в том, что вы ловите Exceptionне ApiException, Попробуй это:

try {
$data = $this->_makeCall('POST', 'connection', $data);
$this->_csrfToken = $data['csrfToken'];
$this->_sessionId = $data['sessionId'];
$this->_alternateHostList = $data['alternateHostList'];
} catch (ApiException $e){ // Here is the change: Exception to ApiException
$this->_displayError($e);
}
0

Другие решения

Ты сделал не импортировать Exception класс в ваше пространство имен, поэтому при выполнении catch (Exception $e), Exception это неизвестный класс (потому что PHP предполагает API\Exception) и PHP не заметят, что APIException это подкласс Exception, Любопытно, что PHP не жалуется на перехват несуществующего класса (я только что подтвердил это локально с помощью PHP 5.6.8).

Следующее должно работать:

catch (\Exception $e) {
// ...
}

В качестве альтернативы:

use Exception;
// ...
catch (\Exception $e) {
// ...
}
2

По вопросам рекламы [email protected]