我正在使用python-binance包版本1.0.16 (今天的最后一个版本)编写一个小的加密货币跟踪器。
我的问题出现在进程的某些特定部分,即通过Client使用api和密钥登录到Binance服务器。这是它的代码:
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 (显然没有注意到),在执行上面的代码后将引发以下异常:
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个例外需要处理:
gaierrorNewConnectionErrorMaxRetryErrorConnectionError首先,我尝试了以下基于this approach的代码,因为我认为gaierror始终是引发的第一个异常,因此我认为通过正确地处理它,不会引发其余的异常:
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:")不幸的是,我的方法没有处理任何事情,最终抛出的输出与上面描述的完全相同,只有相同的异常以相同的顺序引发。
然而,这另一个工作!:
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,也没有让我确切地知道背后发生了什么,以及如何解释用户为什么会发生这样的事情,所以你能帮我解决这个问题吗?
发布于 2022-08-15 05:01:48
您可以像这样扩展除其他块:
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:")或
except gaierror as ge:
print("something ge specific")
except NewConnectionError as nce:
print("something nce specific")
# ...使用后一种方法,您可以独立地处理每个错误。如果您只想过滤掉连接错误并在一个批处理它们,第一个是一个很好的选择。
谢谢。
https://stackoverflow.com/questions/73356995
复制相似问题