首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确处理Python3上的多个连接错误异常?与python-binance包相关

如何正确处理Python3上的多个连接错误异常?与python-binance包相关
EN

Stack Overflow用户
提问于 2022-08-15 04:44:54
回答 1查看 99关注 0票数 1

我正在使用python-binance包版本1.0.16 (今天的最后一个版本)编写一个小的加密货币跟踪器。

我的问题出现在进程的某些特定部分,即通过Client使用api和密钥登录到Binance服务器。这是它的代码:

代码语言:javascript
复制
from binance.Client import Client

api = input("Paste your API KEY here: ")
secret = input("Now paste your SECRET KEY here: ")

client = Client(api_key=api, api_secret=secret, tld = "com")

注意:只要用户有稳定的internet连接,就不会引发任何异常,从而允许跟踪器按预期工作。

但是,如果用户甚至没有连接到internet (显然没有注意到),在执行上面的代码后将引发以下异常:

代码语言:javascript
复制
Traceback (most recent call last):

  File "F:\Python\Python310\lib\site-packages\urllib3\connection.py", line 174, in _new_conn
    conn = connection.create_connection(

  File "F:\Python\Python310\lib\site-packages\urllib3\util\connection.py", line 72, in create_connection
    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):

  File "F:\Python\Python310\lib\socket.py", line 955, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):

gaierror: [Errno 11001] getaddrinfo failed


During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "F:\Python\Python310\lib\site-packages\urllib3\connectionpool.py", line 703, in urlopen
    httplib_response = self._make_request(

  File "F:\Python\Python310\lib\site-packages\urllib3\connectionpool.py", line 386, in _make_request
    self._validate_conn(conn)

  File "F:\Python\Python310\lib\site-packages\urllib3\connectionpool.py", line 1042, in _validate_conn
    conn.connect()

  File "F:\Python\Python310\lib\site-packages\urllib3\connection.py", line 358, in connect
    self.sock = conn = self._new_conn()

  File "F:\Python\Python310\lib\site-packages\urllib3\connection.py", line 186, in _new_conn
    raise NewConnectionError(

NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x0000020B4CEB4A00>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed


During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "F:\Python\Python310\lib\site-packages\requests\adapters.py", line 489, in send
    resp = conn.urlopen(

  File "F:\Python\Python310\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
    retries = retries.increment(

  File "F:\Python\Python310\lib\site-packages\urllib3\util\retry.py", line 592, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))

MaxRetryError: HTTPSConnectionPool(host='api.binance.com', port=443): Max retries exceeded with url: /api/v3/ping (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x0000020B4CEB4A00>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))


During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "F:\Python\Python310\lib\site-packages\spyder_kernels\py3compat.py", line 356, in compat_exec
    exec(code, globals, locals)

  File "c:\users\user\.spyder-py3\btcusdt_only-signals.system.py", line 207, in <module>
    client = Client(api_key= api_key, api_secret= secret_key, tld= "com")

  File "F:\Python\Python310\lib\site-packages\binance\client.py", line 300, in __init__
    self.ping()

  File "F:\Python\Python310\lib\site-packages\binance\client.py", line 526, in ping
    return self._get('ping', version=self.PRIVATE_API_VERSION)

  File "F:\Python\Python310\lib\site-packages\binance\client.py", line 371, in _get
    return self._request_api('get', path, signed, version, **kwargs)

  File "F:\Python\Python310\lib\site-packages\binance\client.py", line 334, in _request_api
    return self._request(method, uri, signed, **kwargs)

  File "F:\Python\Python310\lib\site-packages\binance\client.py", line 314, in _request
    self.response = getattr(self.session, method)(uri, **kwargs)

  File "F:\Python\Python310\lib\site-packages\requests\sessions.py", line 600, in get
    return self.request("GET", url, **kwargs)

  File "F:\Python\Python310\lib\site-packages\requests\sessions.py", line 587, in request
    resp = self.send(prep, **send_kwargs)

  File "F:\Python\Python310\lib\site-packages\requests\sessions.py", line 701, in send
    r = adapter.send(request, **kwargs)

  File "F:\Python\Python310\lib\site-packages\requests\adapters.py", line 565, in send
    raise ConnectionError(e, request=request)

ConnectionError: HTTPSConnectionPool(host='api.binance.com', port=443): Max retries exceeded with url: /api/v3/ping (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x0000020B4CEB4A00>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))

因此,从本质上讲,有4个例外需要处理:

  • gaierror
  • NewConnectionError
  • MaxRetryError
  • ConnectionError

首先,我尝试了以下基于this approach的代码,因为我认为gaierror始终是引发的第一个异常,因此我认为通过正确地处理它,不会引发其余的异常:

代码语言:javascript
复制
from binance.Client import Client
import socket

api = input("Paste your API KEY here: ")
secret = input("Now paste your SECRET KEY here: ")

while True:
    try: 
        client = Client(api_key= api_key, api_secret= secret_key, tld= "com")
        break
    except socket.gaierror:
        print("You are not connected to the internet, first make sure to be connected before executing this program")
        input("Once done, press Enter key:")

不幸的是,我的方法没有处理任何事情,最终抛出的输出与上面描述的完全相同,只有相同的异常以相同的顺序引发。

然而,这另一个工作!:

代码语言:javascript
复制
from binance.Client import Client

api = input("Paste your API KEY here: ")
secret = input("Now paste your SECRET KEY here: ")

while True:
    try: 
        client = Client(api_key= api_key, api_secret= secret_key, tld= "com")
        break
    except Exception:
        print("You are not connected to the internet, first make sure to be connected before executing this program")
        input("Once done, press Enter key:")

所以,伙计们,我来这里是想知道是否有比设置except Exception来处理4种异常更好的方法?你知道,在我看来,它看起来不是很Good Practices,也没有让我确切地知道背后发生了什么,以及如何解释用户为什么会发生这样的事情,所以你能帮我解决这个问题吗?

EN

Stack Overflow用户

回答已采纳

发布于 2022-08-15 05:01:48

您可以像这样扩展除其他块:

代码语言:javascript
复制
from binance.Client import Client
import socket
from urllib3.exceptions import NewConnectionError, MaxRetryError, ConnectionError

api = input("Paste your API KEY here: ")
secret = input("Now paste your SECRET KEY here: ")

while True:
    try: 
        client = Client(api_key= api_key, api_secret= secret_key, tld= "com")
        break
    except (socket.gaierror, NewConnectionError, MaxRetryError, ConnectionError) as e:
        print("You are not connected to the internet, first make sure to be connected before executing this program")
        input("Once done, press Enter key:")

代码语言:javascript
复制
    except gaierror as ge:
        print("something ge specific")
    except NewConnectionError as nce:
        print("something nce specific")
    # ...

使用后一种方法,您可以独立地处理每个错误。如果您只想过滤掉连接错误并在一个批处理它们,第一个是一个很好的选择。

谢谢。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73356995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档