sandersrocket
@sandersrocket
programmer

Как правильно сделать обработчик в async python?

Не могу понять, как правильно в async и aiohttp использовать метод try catch или в принципе – обрабатывать ошибки.

Видел на форумах пишут через while true, но что-то не особо помогает.
Ошибка, связанная с timeout.
Возможно это ещё происходит из-за того, что у меня нет потоков, т.к это вызывается в Telegram боте:
if call.data == 'build':
        try:
            await bot.edit_message_text(text = '⚙️Создаю...', 
                                    chat_id = call.message.chat.id, 
                                    message_id = call.message.id)
            get_user: tuple = db.get_user_info(call.message.chat.id)
            tag: str = get_user[2].replace("_", "")
            build_path: str = await api_functions.download_build(f'@{tag}')

            if not build_path:
                await bot.send_message(call.message.chat.id, '⚙️Не удалось создать, попробуйте снова')
                return
            
            await bot.send_document(call.message.chat.id, open(build_path, 'rb'), 
                            caption = '⚙️Ваш документ',
                            reply_markup = inline_keyboards.back_menu())
            
            return os.remove(build_path)
        except:
            await bot.send_message(call.message.chat.id, '⚙️Не удалось создать, попробуйте снова')
            return


async def download_build(tag: str) -> str:
    async with aiohttp.ClientSession() as session:
        async with session.get(f'req') as response:
            if response.status != 200:
                return None

            file_path = f'./builds/{tag.replace("@", "")}.zip'
            output_path = f'./builds/{str(uuid.uuid4())}.exe'

            async with aiofiles.open(file_path, 'wb') as file:
                while True:
                    chunk = await response.content.read(1024)
                    if not chunk:
                        break
                    await file.write(chunk)

            file_path_after_extraction = None
            with pyzipper.AESZipFile(file_path) as zip_file:
                for file_info in zip_file.infolist():
                    if file_info.filename.endswith('.exe'):
                        file_path_after_extraction = f'./builds/{tag.replace("@", "")}.exe'
                        with open(file_path_after_extraction, 'wb') as extracted_file:
                            extracted_file.write(zip_file.read(file_info.filename, pwd=bytes(settings.config['password_archive'], 'utf-8')))
                        break

            os.remove(file_path)

            headers = {'Authorization': settings.config["packlab"]}
            files = {os.path.basename(file_path_after_extraction): open(file_path_after_extraction, 'rb')}
            async with session.post('req', headers=headers, data=files) as response:
                if response.status != 200:
                    return None

                async with aiofiles.open(output_path, 'wb') as file:
                    while True:
                        chunk = await response.content.read(1024)
                        if not chunk:
                            break
                        await file.write(chunk)

                os.remove(file_path_after_extraction)
                return output_path
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
Как правильно сделать обработчик в async python?
так же как в и обычном, и не нужно делать общий except. Так же не нужно ловить в больших блоках, лови именно в том месте где исключение и возникает
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы