Portál AbcLinuxu, 10. května 2025 05:32

Dotaz: Python 3 + PyMySql zachytávání výjimek

31.10.2011 00:14 Martin Matějek | skóre: 12 | blog: Flying_circus | Kladno
Python 3 + PyMySql zachytávání výjimek
Přečteno: 398×
Odpovědět | Admin
Zdravím,

tvořím jednoduchou webovou aplikaci v CherryPy, která vytáhne data z MySQL a určitým způsobem je zobrazí. Problém je, že se mi nedaří zachytit výjimku(y), když například neběží databáze, vypadne spojení, atd.

Když se nepodaří připojit k databázi, dostanu takový traceback
Traceback (most recent call last):
  File "/usr/lib/python3.2/site-packages/PyMySQL3-0.4-py3.2.egg/pymysql/connections.py", line 661, in _connect
    sock.connect((self.host, self.port))
socket.error: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.2/site-packages/cherrypy/_cprequest.py", line 656, in respond
    response.body = self.handler()
  File "/usr/lib/python3.2/site-packages/cherrypy/lib/encoding.py", line 188, in __call__
    self.body = self.oldhandler(*args, **kwargs)
  File "/usr/lib/python3.2/site-packages/cherrypy/_cpdispatch.py", line 34, in __call__
    return self.callable(*self.args, **self.kwargs)
  File "/home/yenn/FIT/SP1/git/lib/frontend.py", line 30, in login
    conn.open()
  File "/home/yenn/FIT/SP1/git/lib/sql.py", line 24, in open
    self.conn = pymysql.connect(host=self.database_var['hostname'], port=int(self.database_var['port']), user=self.database_var['user'], passwd=self.database_var['passwd'], db=self.database_var['dbname'])
  File "/usr/lib/python3.2/site-packages/PyMySQL3-0.4-py3.2.egg/pymysql/__init__.py", line 93, in Connect
    return Connection(*args, **kwargs)
  File "/usr/lib/python3.2/site-packages/PyMySQL3-0.4-py3.2.egg/pymysql/connections.py", line 513, in __init__
    self._connect()
  File "/usr/lib/python3.2/site-packages/PyMySQL3-0.4-py3.2.egg/pymysql/connections.py", line 669, in _connect
    raise OperationalError(2003, "Can't connect to MySQL server on %r (%d)" % (self.host, e.args[0]))
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' (111)")

Podle jedné stránky by mělo stačit
try:
    ...
except socket.error, (value,message): 
    print ("Socket error: ", message) 
    sys.exit(1)
ale to mojí výjimku nezachytí. Nepomůže ani obecná výjimka
import sys

try:
    foo()
except:
    print("Unexpected exception or error: ", sys.exc_info()[0])
    raise
výjimky prostě projdou bez povšimnutí.

Zkoušel jsem zachytávat pymysql.err.OperationalError,OperationalError a další specifické vyjimky, ale žádná změna.

Pokud vím, výjimky jdou nahoru, dokud je něco nezachytí anebo neshodí program. Jak a kde je tedy zachytávat, když na všechno co jsem zkoušel nereagují?

P.S.: Python 3.2.2, PyMySQL3 0.4
Don't judge me by the friends I keep. No, no, no. Judge me by the enemies I have slain!

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (Martin Matějek (tazatel))
31.10.2011 01:19 mimi.vx | skóre: 37 | blog: Mimi.VX | Praha
Rozbalit Rozbalit vše Re: Python 3 + PyMySql zachytávání výjimek
Odpovědět | | Sbalit | Link | Blokovat | Admin

raise OperationalError(2003, "Can't connect to MySQL server on %r (%d)" % (self.host, e.args[0]))

Dle tohoto řádku bych zkusil odchytit pymysql.err.OperationalError

A pozor na to že všechny chyby v Py3k jsou třídy .. viz http://docs.python.org/py3k/tutorial/errors.html

USE="-gnome -kde";turris
31.10.2011 16:24 Martin Matějek | skóre: 12 | blog: Flying_circus | Kladno
Rozbalit Rozbalit vše Re: Python 3 + PyMySql zachytávání výjimek
Zkusil jsem si napsat co nejkratší kus kódu na otestování a funguje to jak má. Asi jsem v původním kódu měl někde překlep.
Don't judge me by the friends I keep. No, no, no. Judge me by the enemies I have slain!

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.