Обработка ошибок
Иногда при запросах к api вконтакте возникают ошибки, для их обработки во фреймворке предусмотрено несколько инструментов
try ... except VKAPIError
Для начала разъясним что такое VKAPIError, это подтип CodeException, особенность которого заключается в том, чтобы ошибка идентифицировалась в except и без указанного кода (except VKAPIError) и при указании кода (except VKAPIError[code])
В VKAPIError есть два поля:
code- код ошибки, interror_msg- описание ошибки, str
Чтобы использовать VKAPIError нужно импортировать его:
Теперь можно обернуть какой нибудь код с запросом к API:
При исполнении этого кода vk вернет ошибку, из-за того что не были переданы нужные параметры
try ... except VKAPIError[code]
Кроме более общего способа для обработки всех ошибок vk в одном блоке except, вы можете воспользоваться более конкретным VKAPIError[code]
Примечание
Список всех ошибок с их кодами вы можете найти здесь
Сделаем несколько блоков для демонстрации того, как первый и второй способ можно комбинировать
Специфичные ошибки
Некоторые ошибки vk имеют дополнительные поля, которые могут понадобиться вам для их обработки:
CaptchaError:captcha_sid- идентификатор captcha, strcaptcha_img- ссылка на изображение, str
ErrorHandler
Примечание
Инструмент будет рассматриваться конкретно с ботом, хоть это и отдельный объект, так как это - туториал - упрощенный вариант документации
Техническая документация по хендлеру ошибок здесь
У ErrorHandler есть 4 метода:
register_error_handler- декоратор, принимающий типы ошибок и асинхронную функцию-хендлер. Если возникнет одна из указанных ошибок (или её подтипа), исполнится указанный хендлер.register_undefined_error_handler- декоратор, принимающий тип ошибки и асинхронную функцию-хендлер. Если возникнет неизвестная ошибка, исполнится этот хендлер.handle, принимающий экземпляр ошибки. Передаёт ошибку в соответствующий хендлер, зарегистрированный с помощью вышеописанных декораторов. Если для данной ошибки нет хендлера, поднимает её.catch- декоратор. Ловит ошибки из декорированной функции и передаёт их методуhandle.
В примере создано 2 хендлера ошибок: для RuntimeError и конкретизированного VKAPIError
Также можно регистрировать хендлеры сразу для нескольких типов ошибок:
Ещё у ErrorHandler есть параметр redirect_arguments: bool, который позволяет передавать в хендлер аргументы из задекорированной с помощью catch функции. В связке с ботом позволяет передать в хендлер контекстные аргументы из правил и мидлварей.
Подробнее про ErrorHandler.catch можно почитать здесь