5

Używam Python/Bottle/SqlAlchemy/MySQL dla usługi sieci Web.nie można przechwycić błędu integralności MySQL w Pythonie

Próbuję złapać błąd IntegrityError wywołany przez wywołanie procedury przechowywanej, ale nie mogę tego zrobić.

Stosując tę ​​

cursor = connection.cursor() 
cursor.callproc('my_stored_proc', [arguments]) 

daje taki sam wynik jak

try: 
    cursor = connection.cursor() 
    cursor.callproc('my_stored_proc', [arguments]) 
except IntegrityError as e: 
    print("Error: {}".format(e)) 
    return {"message": e.message} 

uzyskać IntegrityError wyjątek w obu przypadkach. Dlaczego wyjątek nie został złapany w tym drugim przypadku?

+0

Jak/kiedy ty zobowiązującego transakcję? "IntegrityError" prawdopodobnie zostanie podniesiony, gdy transakcja zostanie zatwierdzona, a nie podczas wywoływania procedury składowanej. –

Odpowiedz

10

Problem polegał na tym, że złapałem niepoprawny wyjątek.

Okazało się, że podniesiony błąd jest rzeczywiście typu pymysql.err.IntegrityError, a nie sqlalchemy.exc.IntegrityError, jak zakładałem.

dowiedziałem się typ wyjątku, wykonując:

import sys 
try: 
    cursor = connection.cursor() 
    cursor.callproc('my_stored_proc', [arguments]) 
except: 
    print "Unexpected error:", sys.exc_info()[0] 

I zobaczyłem ten wydruk:

Unexpected error: <class 'pymysql.err.IntegrityError'>

+0

To jest świetne .. –