Какую структуру класса использовать для собственных исключений? Всем привет! Пишу общий класс для запросов из API и WEB. Мне нужно сделать так, чтобы для WEИ отдавались одни номера ошибок, а для API другие... Я полагаю, что мне нужно использовать некие константы, которые класс должен отдать в случае ошибки, а уже в местах, где этот класс вызывается, сопоставлять константы ошибок и необходимым номером ошибки и уже его отдавать клиенту. Подскажите как это правильно сделать? Просто делать исключение в классе типа: throw new \FirstClassException("INVALID_TOKEN"); А уже в файле где этот класс вызывается оборачивать код в что-то подобное:try{ // тут работа с классом, где предполагаются исключения типа FirstClassException }catch(FirstClassException $e){ switch($e->getMessage()){ case 'INVALID_TOKEN': $response->setError("Не верный токен", 101); break; //.... перечисление вчех вариантов ошибок } } Мне кажется, что логика верная, но вот такая строка мне не нравится: throw new \FirstClassException("INVALID_TOKEN"); Вероятно, должно быть как-то красивее.
Вам действительно нужно использовать собственные исключения для различных типов ошибок, чтобы упростить обработку и передачу информации об ошибке. Для этого вы можете создать базовый класс исключения, который будет являться родительским для всех ваших собственных исключений.
Примерно так:
class CustomException extends Exception {} class ApiException extends CustomException { const INVALID_TOKEN = 101; const SOMETHING_ELSE = 102; } class WebException extends CustomException { const PAGE_NOT_FOUND = 201; const ACCESS_DENIED = 202; } // В вашем классе для запросов class MyApiClass { public function makeRequest() { // Логика запроса // В случае ошибки throw new ApiException("INVALID_TOKEN"); } } // В месте вызова класса try { $api = new MyApiClass(); $api->makeRequest(); } catch (CustomException $e) { switch ($e->getMessage()) { case ApiException::INVALID_TOKEN: $response->setError("Не верный токен", ApiException::INVALID_TOKEN); break; case ApiException::SOMETHING_ELSE: $response->setError("Другая ошибка", ApiException::SOMETHING_ELSE); break; // Другие ваши обработки ошибок } }
Таким образом, вы можете детально контролировать типы ошибок и передавать соответствующие коды ошибок для API и WEB запросов. Код будет более читаемым и поддерживаемым.
Вам действительно нужно использовать собственные исключения для различных типов ошибок, чтобы упростить обработку и передачу информации об ошибке. Для этого вы можете создать базовый класс исключения, который будет являться родительским для всех ваших собственных исключений.
Примерно так:
class CustomException extends Exception {}class ApiException extends CustomException {
const INVALID_TOKEN = 101;
const SOMETHING_ELSE = 102;
}
class WebException extends CustomException {
const PAGE_NOT_FOUND = 201;
const ACCESS_DENIED = 202;
}
// В вашем классе для запросов
class MyApiClass {
public function makeRequest() {
// Логика запроса
// В случае ошибки
throw new ApiException("INVALID_TOKEN");
}
}
// В месте вызова класса
try {
$api = new MyApiClass();
$api->makeRequest();
} catch (CustomException $e) {
switch ($e->getMessage()) {
case ApiException::INVALID_TOKEN:
$response->setError("Не верный токен", ApiException::INVALID_TOKEN);
break;
case ApiException::SOMETHING_ELSE:
$response->setError("Другая ошибка", ApiException::SOMETHING_ELSE);
break;
// Другие ваши обработки ошибок
}
}
Таким образом, вы можете детально контролировать типы ошибок и передавать соответствующие коды ошибок для API и WEB запросов. Код будет более читаемым и поддерживаемым.