Vorwort:
ich hab diesen Post geschrieben, während ich nebenbei einiges ausprobiert habe. So stelle ich evtl Fragen, die ich mir im weiteren verlauf selbst beantworte, deswegen vor der Antwort bitte bis zum schluss lesen
Danke für die Antworten
-Ja SSLError ist wie im ersten Post erwähnt ein Fehler vom requests Modul und daher stammt auch der Name
-Gut zu wissen, dass man Syntaxfehler nicht umgehen kann, danke
Da der SSL Fehler nur 1-2 mal am Tag auftritt, er nur in der shell angezeigt wird und diese irgendwann die älteren Ausgaben überschreibt (und ich nicht wei0 ob und wo sie alle Ausgaben sonst noch speichert), kümmenr wir uns jetzt erstmal um einen anderen requests Fehler, den ich selber auslösen kann, indem ich die Internetverbindung ausschalte
Das sieht dann wie folgt aus:
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 516, in urlopen
body=body, headers=headers)
File "C:\Python34\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 304, in _make_request
self._validate_conn(conn)
File "C:\Python34\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 722, in _validate_conn
conn.connect()
File "C:\Python34\lib\site-packages\requests\packages\urllib3\connection.py", line 195, in connect
conn = self._new_conn()
File "C:\Python34\lib\site-packages\requests\packages\urllib3\connection.py", line 125, in _new_conn
(self.host, self.port), self.timeout, **extra_kw)
File "C:\Python34\lib\site-packages\requests\packages\urllib3\util\connection.py", line 64, in create_connection
for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
File "C:\Python34\lib\socket.py", line 530, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11001] getaddrinfo failed
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\requests\adapters.py", line 362, in send
timeout=timeout
File "C:\Python34\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 559, in urlopen
_pool=self, _stacktrace=stacktrace)
File "C:\Python34\lib\site-packages\requests\packages\urllib3\util\retry.py", line 245, in increment
raise six.reraise(type(error), error, _stacktrace)
File "C:\Python34\lib\site-packages\requests\packages\urllib3\packages\six.py", line 309, in reraise
raise value.with_traceback(tb)
File "C:\Python34\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 516, in urlopen
body=body, headers=headers)
File "C:\Python34\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 304, in _make_request
self._validate_conn(conn)
File "C:\Python34\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 722, in _validate_conn
conn.connect()
File "C:\Python34\lib\site-packages\requests\packages\urllib3\connection.py", line 195, in connect
conn = self._new_conn()
File "C:\Python34\lib\site-packages\requests\packages\urllib3\connection.py", line 125, in _new_conn
(self.host, self.port), self.timeout, **extra_kw)
File "C:\Python34\lib\site-packages\requests\packages\urllib3\util\connection.py", line 64, in create_connection
for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
File "C:\Python34\lib\socket.py", line 530, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
requests.packages.urllib3.exceptions.ProtocolError: ('Connection aborted.', gaierror(11001, 'getaddrinfo failed'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "KrakenRock.py", line 510, in <module>
get_Ticker()
File "KrakenRock.py", line 413, in suchen
tickerInfo_rock = rock.MarketData(pairCode_rock)
File "C:\BOT\PyRockin3.py", line 105, in MarketData
response = requests.get(url+pair).json()
File "C:\Python34\lib\site-packages\requests\api.py", line 60, in get
return request('get', url, **kwargs)
File "C:\Python34\lib\site-packages\requests\api.py", line 49, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Python34\lib\site-packages\requests\sessions.py", line 457, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python34\lib\site-packages\requests\sessions.py", line 569, in send
r = adapter.send(request, **kwargs)
File "C:\Python34\lib\site-packages\requests\adapters.py", line 407, in send
raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', gaierror(11001, 'getaddrinfo failed'))
.... ich bin gerade ein wenig verwirrt, weil ich mir diese Fehlermeldung schon häufiger angesehen habe und bis vor kurzem stand da unter der ersten Fehlermeldung was von einem "ConnectionAbortedError", der jetzt aber nicht mehr dort steht... komisch..
Naja gut, zumindest ConnectionError und ProtocolError haben wir ja noch.
Was müsste ich nun machen, um dafür zu sorgen, dass mein Skriptdurchführung deswegen nicht abgebrochen wird, sondern wie oben angedeutet, eine selbstgeschriebene Fehlermeldung erscheint wie "keine Verbindung zum internet", dann 10 sekunden gewartet wird und dann ein neuer Versuch gestartet wird.
Ich habe schon gefühlt alles versucht, von nacheinander folgenden except aufrufen (wobei ich gerade gelesen habe, dass immer nur ein except Blcok pro try ausgeführt wird) aber auch ein except(ConnectionError,ProtocolError) funktioniert nicht, was allerdings am Namen liegen könnte. Denn wenn ich diesen except(ConnectionError,ProtocolError) verwende, sieht die Fehlermeldung genauso aus wie bisher, aber zusätzlich kommt noch:
Traceback (most recent call last):
File "KrakenRock.py", line 510, in <module>
get_Ticker()
File "KrakenRock.py", line 417, in suchen
except (ConnectionError,ProtocolError):
NameError: name 'ProtocolError' is not defined
Da frage ich mich schon, warum ProtocolError nicht definiert ist, aber ConnectionError schon, wo doch beides aus requests kommt, oder nicht? Der SSLError Name ist übrigens auch nicht definiert.
Also davon ausgehend, dass wir hier 2 Fehlermeldungen erhalten. Wenn ich nur eine davon mit eines except Blocks berücksichtige, ist es so, als hätte ich garnichts berücksichtigt? Nur wenn ich genau die Fehlermeldungen die ein try Block verursacht in einem Tupel hintereinander wegschreibe, wird mein except auch ausgeführt? So kommt es mir gerade jedenfalls vor =/
Mein Versuch es nur mit "except" zu machen, ohne weiteren Namen zeigt mir gerade, dass meine Vermutung zu stimmen scheint. denn nur mit except ohne Namen, wird mein except Block ausgeführt und der Durchlauf nicht gestoppt
Dass ich das nicht gleich so gemacht habe lag daran, dass ich das schonmal ausprobiert hatte, es aber nicht geklappt hatte... hatte da vermutlich noch einen anderen Fehler mit drin, weshalb ich "except" ohne Namen verworfen hatte.
Gut.. das heißt also wenn ich auf eine ganz bestimmte Fehlerkombination reagieren möchte, wie z.b wenn ich die InetVerbindung abschalte, dann muss ich erst eine fehlermeldung provozieren, um zu sehen in welche Kombination die Fehler auftreten?
da gibt es doch bestimmt einen besseren Weg für, oder?
Angenommen ich weiß nicht, wie die Fehlernamen heißen, die bei Verbindungsverlust auftreten. Nun möchte ich beim Abfragen der API aber einen Verbindungsabbruch berücksichtigen. Genauso möchte ich den SSL Fehler einzeln berücksichtigen. Und dann noch alle sonstigen Fehler.
Dann würde es also so aussehen:
Code: Alles auswählen
try:
tickerInfo_rock = rock.MarketData(pairCode_rock)
except Verbindungsfehlername as err::
print("keine Internetverbindung: {0}".format(err))
return()
except SSLError as err:
print("SSL Fehler: {0}".format(err))
return()
except:
print("unbekannter Fehler", sys.exc_info()[0])
return()
"Verbindungsfehlername" wäre also in dem Fall unbekannt. Das wäre z.b der Fall, wenn es sich um einen Fehler handelt, den ich nicht simulieren kann oder möchte (weil sonst alles kaputt geht oderso, wer weiß). Wie würde ich nun also rausfinden, welche Fehlernamen ich für "Verbindungsfehlername" einsetzen muss? und woher erfahre ich den definierten Namen des SSLError bzw. des ProtocolError?