Исключения
Документация по исключения. Часть API wrapper для КиноПоиска.
Классы исключений для обработки ошибок в Kinopoisk API.
📚 Навигация: Главная → Исключения
📋 Список исключений
⚠️ ApiException
Базовое исключение для всех ошибок, связанных с Kinopoisk API.
Основные возможности:
- Базовый класс для всех исключений API
- Поддержка цепочки исключений
- Коды ошибок (обычно HTTP статус коды)
- Детальные сообщения об ошибках
Наследование: Наследует от стандартного класса Exception PHP
Использование: Обработка общих ошибок API
🔑 InvalidApiKeyException
Исключение для неверного или отсутствующего API ключа.
Основные возможности:
- Специализированное исключение для проблем с API ключом
- Предустановленный код ошибки 401
- Стандартное сообщение об ошибке
- Наследование от ApiException
Наследование: Наследует от ApiException
Использование: Обработка ошибок аутентификации
⏱️ RateLimitException
Исключение для превышения лимита запросов к API.
Основные возможности:
- Специализированное исключение для превышения лимитов
- Предустановленный код ошибки 429
- Стандартное сообщение об ошибке
- Наследование от ApiException
Наследование: Наследует от ApiException
Использование: Обработка превышения лимитов запросов
🔍 ResourceNotFoundException
Исключение для ненайденных ресурсов в API.
Основные возможности:
- Специализированное исключение для не найденных ресурсов
- Предустановленный код ошибки 404
- Стандартное сообщение об ошибке
- Наследование от ApiException
Наследование: Наследует от ApiException
Использование: Обработка отсутствующих ресурсов
✅ KpValidationException
Исключение для ошибок валидации данных.
Основные возможности:
- Специализированное исключение для ошибок валидации
- Детальные сообщения об ошибках валидации
- Поддержка предыдущих исключений
- Наследование от ApiException
Наследование: Наследует от ApiException
Использование: Обработка ошибок валидации входных данных
🔗 Связанные компоненты
Сервисы
- FilmService - Может выбрасывать все типы исключений
- PersonService - Может выбрасывать все типы исключений
- MediaService - Может выбрасывать все типы исключений
- UserService - Может выбрасывать все типы исключений
Модели
- Film - Может выбрасывать KpValidationException
- Person - Может выбрасывать KpValidationException
- Staff - Может выбрасывать KpValidationException
- Review - Может выбрасывать KpValidationException
Ответы
- DefaultResponse - Может выбрасывать KpValidationException
- PaginatedResponse - Может выбрасывать KpValidationException
- KeywordSearchResponse - Может выбрасывать KpValidationException
🚀 Быстрый старт
Обработка исключений
<?php
require_once 'vendor/autoload.php';
use NotKinopoisk\Client;
use NotKinopoisk\Exception\ApiException;
use NotKinopoisk\Exception\InvalidApiKeyException;
use NotKinopoisk\Exception\RateLimitException;
use NotKinopoisk\Exception\ResourceNotFoundException;
use NotKinopoisk\Exception\KpValidationException;
// Создание клиента
$client = new Client('your-api-key');
// Обработка различных типов исключений
try {
$film = $client->films->getById(999999);
echo "Фильм получен: {$film->getDisplayName()}\n";
} catch (ResourceNotFoundException $e) {
echo "Фильм не найден: {$e->getMessage()}\n";
echo "Код ошибки: {$e->getCode()}\n";
} catch (RateLimitException $e) {
echo "Превышен лимит запросов: {$e->getMessage()}\n";
echo "Код ошибки: {$e->getCode()}\n";
// Ждем и повторяем
sleep(1);
} catch (InvalidApiKeyException $e) {
echo "Неверный API ключ: {$e->getMessage()}\n";
echo "Код ошибки: {$e->getCode()}\n";
} catch (KpValidationException $e) {
echo "Ошибка валидации: {$e->getMessage()}\n";
echo "Код ошибки: {$e->getCode()}\n";
} catch (ApiException $e) {
echo "Общая ошибка API: {$e->getMessage()}\n";
echo "Код ошибки: {$e->getCode()}\n";
}Создание пользовательских исключений
// Создание базового исключения API
$apiException = new ApiException('Ошибка сети при обращении к API', 500);
echo "Сообщение: {$apiException->getMessage()}\n";
echo "Код: {$apiException->getCode()}\n";
// Создание исключения с цепочкой
$previousException = new Exception('Ошибка сети');
$apiException = new ApiException('Не удалось получить данные', 500, $previousException);
if ($apiException->getPrevious()) {
echo "Причина: " . $apiException->getPrevious()->getMessage() . "\n";
}
// Создание специализированных исключений
$notFoundException = new ResourceNotFoundException('Фильм с ID 12345 не существует');
$rateLimitException = new RateLimitException();
$invalidKeyException = new InvalidApiKeyException();
$validationException = new KpValidationException('Некорректные данные фильма');📖 Примеры использования
Безопасный вызов API
// Функция для безопасного выполнения API запросов
function safeApiCall(callable $apiCall, string $operation = 'API операция'): mixed {
try {
return $apiCall();
} catch (ApiException $e) {
logApiError($e, $operation);
return null;
}
}
// Функция для логирования ошибок API
function logApiError(ApiException $e, string $operation): void {
$logMessage = sprintf(
"[%s] API Error in %s: %s (Code: %d) in %s:%d",
date('Y-m-d H:i:s'),
$operation,
$e->getMessage(),
$e->getCode(),
$e->getFile(),
$e->getLine()
);
error_log($logMessage);
if ($e->getPrevious()) {
error_log("Previous exception: " . $e->getPrevious()->getMessage());
}
}
// Использование
$film = safeApiCall(
fn() => $client->films->getById(123),
'получение фильма по ID'
);
if ($film === null) {
echo "Не удалось получить фильм\n";
}Детальная обработка ошибок
// Функция для получения детальной информации об ошибке
function getApiErrorDetails(ApiException $e): array {
return [
'message' => $e->getMessage(),
'code' => $e->getCode(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTraceAsString(),
'previous' => $e->getPrevious() ? [
'message' => $e->getPrevious()->getMessage(),
'code' => $e->getPrevious()->getCode(),
'class' => get_class($e->getPrevious())
] : null
];
}
// Функция для определения типа ошибки по коду
function getApiErrorType(int $code): string {
return match (true) {
$code >= 400 && $code < 500 => 'Client Error',
$code >= 500 && $code < 600 => 'Server Error',
$code === 0 => 'Network Error',
default => 'Unknown Error'
};
}
// Функция для создания пользовательского сообщения об ошибке
function createUserFriendlyMessage(ApiException $e): string {
$errorType = getApiErrorType($e->getCode());
return match ($errorType) {
'Client Error' => 'Ошибка запроса. Проверьте параметры и попробуйте снова.',
'Server Error' => 'Ошибка сервера. Попробуйте позже.',
'Network Error' => 'Ошибка сети. Проверьте подключение к интернету.',
default => 'Произошла неизвестная ошибка: ' . $e->getMessage()
};
}
// Использование
try {
$client->films->getById(999999);
} catch (ApiException $e) {
$errorDetails = getApiErrorDetails($e);
$userMessage = createUserFriendlyMessage($e);
echo "Пользовательское сообщение: {$userMessage}\n";
echo "Тип ошибки: " . getApiErrorType($e->getCode()) . "\n";
echo "Детали ошибки:\n";
print_r($errorDetails);
}Обработка специфических исключений
// Обработка не найденных ресурсов
try {
$film = $client->films->getById(999999);
} catch (ResourceNotFoundException $e) {
echo "Ресурс не найден: {$e->getMessage()}\n";
// Можно попробовать поиск по названию
$searchResults = $client->films->searchByKeyword('матрица');
if (!$searchResults->isEmpty()) {
echo "Найдены похожие фильмы\n";
}
}
// Обработка превышения лимита
try {
$films = $client->films->getTop();
} catch (RateLimitException $e) {
echo "Превышен лимит запросов\n";
// Ждем и повторяем
sleep(2);
$films = $client->films->getTop();
}
// Обработка неверного API ключа
try {
$apiInfo = $client->user->getApiKeyInfo();
} catch (InvalidApiKeyException $e) {
echo "Неверный API ключ\n";
// Можно попросить пользователя проверить ключ
echo "Пожалуйста, проверьте правильность API ключа\n";
}
// Обработка ошибок валидации
try {
$film = Film::fromArray(['invalid' => 'data']);
} catch (KpValidationException $e) {
echo "Ошибка валидации: {$e->getMessage()}\n";
// Можно показать пользователю, какие поля некорректны
}🔧 Общие методы
Все исключения наследуют методы от стандартного класса Exception:
getMessage()
public function getMessage(): stringВозвращает сообщение об ошибке.
getCode()
public function getCode(): intВозвращает код ошибки.
getFile()
public function getFile(): stringВозвращает путь к файлу, где произошла ошибка.
getLine()
public function getLine(): intВозвращает номер строки, где произошла ошибка.
getTrace()
public function getTrace(): arrayВозвращает стек вызовов.
getTraceAsString()
public function getTraceAsString(): stringВозвращает стек вызовов в виде строки.
getPrevious()
public function getPrevious(): ?ThrowableВозвращает предыдущее исключение в цепочке.
📊 Статистика исключений
ApiException
- Наследование: Exception
- Код по умолчанию: 0
- Использование: Базовый класс для всех исключений API
InvalidApiKeyException
- Наследование: ApiException
- Код по умолчанию: 401
- Использование: Ошибки аутентификации
RateLimitException
- Наследование: ApiException
- Код по умолчанию: 429
- Использование: Превышение лимитов запросов
ResourceNotFoundException
- Наследование: ApiException
- Код по умолчанию: 404
- Использование: Не найденные ресурсы
KpValidationException
- Наследование: ApiException
- Код по умолчанию: 400
- Использование: Ошибки валидации данных
🔗 Связанные разделы
- Сервисы - Выбрасывают исключения
- Модели - Могут выбрасывать исключения валидации
- Ответы - Могут выбрасывать исключения валидации
- Перечисления - Используются в исключениях
- Интерфейсы - Базовые интерфейсы