Перейти к содержанию

Исключения

Классы исключений для обработки ошибок в 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

Ответы

🚀 Быстрый старт

Обработка исключений

PHP
<?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";
}

Создание пользовательских исключений

PHP
// Создание базового исключения 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

PHP
// Функция для безопасного выполнения 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";
}

Детальная обработка ошибок

PHP
// Функция для получения детальной информации об ошибке
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);
}

Обработка специфических исключений

PHP
// Обработка не найденных ресурсов
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()

PHP
public function getMessage(): string

Возвращает сообщение об ошибке.

getCode()

PHP
public function getCode(): int

Возвращает код ошибки.

getFile()

PHP
public function getFile(): string

Возвращает путь к файлу, где произошла ошибка.

getLine()

PHP
public function getLine(): int

Возвращает номер строки, где произошла ошибка.

getTrace()

PHP
public function getTrace(): array

Возвращает стек вызовов.

getTraceAsString()

PHP
public function getTraceAsString(): string

Возвращает стек вызовов в виде строки.

getPrevious()

PHP
public function getPrevious(): ?Throwable

Возвращает предыдущее исключение в цепочке.

📊 Статистика исключений

ApiException

  • Наследование: Exception
  • Код по умолчанию: 0
  • Использование: Базовый класс для всех исключений API

InvalidApiKeyException

  • Наследование: ApiException
  • Код по умолчанию: 401
  • Использование: Ошибки аутентификации

RateLimitException

  • Наследование: ApiException
  • Код по умолчанию: 429
  • Использование: Превышение лимитов запросов

ResourceNotFoundException

  • Наследование: ApiException
  • Код по умолчанию: 404
  • Использование: Не найденные ресурсы

KpValidationException

  • Наследование: ApiException
  • Код по умолчанию: 400
  • Использование: Ошибки валидации данных

🔗 Связанные разделы