异常情况下重新启动asyncio循环?

2024-04-26 23:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望每次抛出一个异常,比如502httperror或Floodwaiterror来重新启动循环或继续,但是我不知道或者不知道如何去做

代码:

import time
from telethon import TelegramClient,errors
from telethon.tl.functions.photos import UploadProfilePhotoRequest
import os
import urllib.request
import urllib.error
import asyncio
from datetime import datetime
import datetime
api_id =  XXXXXX
api_hash = 'XXXXXXXXXXXXXXXX'

client = TelegramClient('Test_Session', api_id, api_hash)
client.start()

async def Change_Photo():
    try:
        while True:
            time.sleep(3)
            if os.path.exists("cat.jpg"):
                os.remove("cat.jpg")
            if os.path.exists("cat"):
                os.remove("cat")
            urllib.request.urlretrieve("https://cataas.com/cat", "cat")
            os.rename('cat', 'cat.jpg')

            await client(UploadProfilePhotoRequest(await client.upload_file(r"C:\Users\localhost\PycharmProjects\Scripts Python\Telethon\cat.jpg")))
            now = datetime.datetime.now()
            os.remove("cat.jpg")
            print("Changed Photo:", now.strftime("%Y-%m-%d %H:%M:%S"))
    except errors.FloodWaitError as e:
        print('Have to sleep', e.seconds, 'seconds')
        await asyncio.sleep(e.seconds)

    except urllib.error.HTTPError as e:
        if e.code == 502:
            print("HTTP error 502... Trying again")





loop = asyncio.get_event_loop()
loop.run_until_complete(Change_Photo())
loop.close()

在每个异常中未关闭循环的异常输出

^{pr2}$

我还尝试在每个异常中关闭循环(循环.关闭)在

except errors.FloodWaitError as e:
    print('Have to sleep', e.seconds, 'seconds')
    await asyncio.sleep(e.seconds)

except urllib.error.HTTPError as e:
    if e.code == 502:
        print("HTTP error 502... Trying again")

但两者都奏效了:

 Have to sleep 761 seconds
Traceback (most recent call last):
  File "C:/Users/localhost/PycharmProjects/Scripts Python/Telethon/anykipsa.py", line 27, in Change_Photo
    await client(UploadProfilePhotoRequest(await client.upload_file(r"C:\Users\localhost\PycharmProjects\Scripts Python\Telethon\cat.jpg")))
  File "C:\Users\localhost\AppData\Local\Programs\Python\Python37\lib\site-packages\telethon\client\users.py", line 60, in __call__
    result = await future
telethon.errors.rpcerrorlist.FloodWaitError: A wait of 761 seconds is required (caused by UploadProfilePhotoRequest)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/localhost/PycharmProjects/Scripts Python/Telethon/anykipsa.py", line 45, in <module>
    loop.run_until_complete(Change_Photo())
  File "C:\Users\localhost\AppData\Local\Programs\Python\Python37\lib\asyncio\base_events.py", line 584, in run_until_complete
    return future.result()
  File "C:/Users/localhost/PycharmProjects/Scripts Python/Telethon/anykipsa.py", line 34, in Change_Photo
    loop.close()
  File "C:\Users\localhost\AppData\Local\Programs\Python\Python37\lib\asyncio\selector_events.py", line 83, in close
    raise RuntimeError("Cannot close a running event loop")
RuntimeError: Cannot close a running event loop

Process finished with exit code 1

几周前,我对编写python还很陌生,当然我做了一些不好的事情,但我找不到什么


Tags: pyimportclientloopasynciolocalhostossleep
2条回答

多亏了@sparky05的解决方案,我才意识到,在某些情况下

from telethon import TelegramClient,errors
from telethon.tl.functions.photos import UploadProfilePhotoRequest
import os
import urllib.request
import urllib.error
import asyncio
from datetime import datetime
import datetime
api_id =  XXXXX
api_hash = 'XXXXXXXXXXXX'

client = TelegramClient('Change_Photo', api_id, api_hash)
client.start()

async def Change_Photo():
    while True:
        try:
            #time.sleep(0)
            if os.path.exists("cat.jpg"):
                os.remove("cat.jpg")
            if os.path.exists("cat"):
                os.remove("cat")
            urllib.request.urlretrieve("https://cataas.com/cat", "cat")
            os.rename('cat', 'cat.jpg')

            await client(UploadProfilePhotoRequest(await client.upload_file(r"C:\Users\localhost\PycharmProjects\Scripts Python\Telethon\cat.jpg")))
            now = datetime.datetime.now()
            os.remove("cat.jpg")
            print("Changed Photo:", now.strftime("%Y-%m-%d %H:%M:%S"))
        except errors.FloodWaitError as e:
            print('Have to sleep', e.seconds, 'seconds')
            await asyncio.sleep(e.seconds)

        except urllib.error.HTTPError as e:
            if e.code == 502:
                print("HTTP error 502... Trying again")
        # except errors.FloodWaitError as e:
        #     print('Have to sleep', e.seconds, 'seconds')
        #     await asyncio.sleep(e.seconds)
        #
        #  except urllib.error.HTTPError as e:
        #     if e.code == 502:
        #      print("HTTP error 502... Trying again")






loop = asyncio.get_event_loop()
loop.run_until_complete(Change_Photo())
loop.close()

仅为完成和描述总体思路: 而不是

async def important_error_prone_function():
    try:
        while True:
            do_something()
    except Error1:
        correct_stuff_1()
    except Error2:
        correct_stuff_2()

使用

^{pr2}$

然后你的函数将继续运行,直到你想停止它。在

相关问题 更多 >