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

Error-Handler

Хендлер ошибок нужен для быстрой и простой высокоуровневой обработки любых типов исключений

Для того чтобы начать с ним работу потребуется создать его и зарегистрировать в него хендлеры исключений

from vkbottle import ErrorHandler

async def exc_handler_runtime(e: RuntimeError):
    print("Oh no runtime error occurred:", e)

async def exc_handler_lookup(e: LookupError):
    print("Oh no lookup error occurred:", e)

error_handler = ErrorHandler(redirect_arguments=False) # Если redirect_arguments = True то все аргументы обернутой функции будут поступать и в хендлер исключения тоже
error_handler.register_error_handler(RuntimeError, exc_handler_runtime)
error_handler.register_error_handler(LookupError, exc_handler_lookup)

Еще вы можете добавить хендлер для ненайденных ошибок:

async def exc_handler_undefined(e: BaseException):
    print("Oh no unknown error occurred", e)

error_handler.register_undefined_error_handler(exc_handler_undefined)

Если вы не хотите писать регистрацию после определения хендлера вы можете сделать это с помощью декоратора:

@error_handler.register_error_handler(ZeroDivisionError)
async def exc_handler_zero_division(e: ZeroDivisionError):
    print("Oops i caught a ZeroDivisionError", e)

# from vkbottle import VKAPIError
@error_handler.register_error_handler(VKAPIError(6)) # Не забывайте про возможность пользоваться этой фишкой фабрики исключений
async def exc_handler_vk_api_6(e: VKAPIError):
    print("Oops i caught a VKAPIError with code 6:", e)

# С register_undefined_error_handler так тоже можно

Теперь чтобы error_handler сработал на вашей асинхронной функции добавьте к ней декоратор:

@error_handler.wraps_error_handler()
async def main():
    raise LookupError("I ve lost my keys")

Запустите ее и оцените вывод:

# from asyncio import run
run(main())
Oh no lookup error occurred: I ve lost my keys