Какие исключения могут быть возвращены из Pandas read_sql ()

У меня есть пользовательская функция, которая использует pymysql для подключения к базе данных mysql, а затем запрашивает базу данных и считывает результаты в кадр данных Pandas.

import pandas as pd import pymysql import getpass def myGetData(myQuery): myServer = 'xxx.xxx.xxx.xxx' myUser = input("Enter MySQL database username: ") myPwd = getpass.getpass("Enter password: ") myConnection = pymysql.connect(host=myServer,user=myUser,password=myPwd) myTempDF = pd.io.sql.read_sql(myQuery, con=myConnection) myConnection.close() return myTempDF myDF = myGetData("SELECT * FROM `myDB`.`myTable`") 

Я написал код для исключения исключений, возникающих из pymysql.connect (), хотя я не показал его здесь для ясности. Я также хочу уловить любые исключения, которые могут возникнуть из read_sql (). Где я могу найти список исключений, которые могут быть подняты? Это не в документации Pandas ( http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.read_sql.html ), и я не могу найти никаких подсказок в Интернете. Я мог бы просто поймать все исключения, но это, похоже, вообще не одобряет сообщество Python. Как следует улавливать исключения, вызванные read_sql ()?

РЕДАКТИРОВАТЬ

Я сделал еще немного работы над этим, и кажется, что даже когда я знаю, какая ошибка генерируется, это не прямолинейно, чтобы поймать исключение. Так, например, в приведенном выше коде, если я неправильно ввел имя пользователя и / или пароль, генерируется операционная ошибка. В итоговой строке или отчете об ошибке читается следующее:

 OperationalError: (1045, "Access denied for user 'yyy'@'xxx.xxx.xxx.xxx' (using password: YES)") 

Я смог поймать эту ошибку, используя:

 try: phjConnection = pymysql.connect(host=phjServer, user=phjUser, password=phjPwd) except pymysql.OperationalError as e: print("\nAn OperationalError occurred. Error number {0}: {1}.".format(e.args[0],e.args[1])) 

Это прекрасно работает (хотя обнаруживается, что OperationalError нужно было поймать с помощью pymysql.OperationalError случайно).

Теперь в следующей части функции функция Pandas real_sql () использует созданное выше соединение для запуска SQL-запроса. Если я включаю преднамеренно неправильный запрос с неправильным именем таблицы, тогда возникает другое событие OperationalError, за которым следует DatabaseError:

 OperationalError: (1142, "SELECT command denied to user 'yyy'@'xxx.xxx.xxx.xxx' for table 'table'") During handling of the above exception, another exception occurred: DatabaseError: Execution failed on sql 'SELECT * FROM `db`.`table`': (1142, "SELECT command denied to user 'yyy'@'xxx.xxx.xxx.xxx' for table 'table'") 

Но теперь я полностью озадачен тем, как я поймаю этот второй OperationalError. Используемый ранее pymysql.OperationalError не работает. Я пробовал почти все, о чем я могу думать, и до сих пор не могу поймать ошибку. Должно ли сообщение об ошибке быть немного более информативным о том, как была создана ошибка и как ее можно поймать? Ясно, что я пропускаю что-то очевидное, но я просто не могу найти решение. Мы ценим любые предложения.

EDIT 2

В ответ на комментарий, я теперь перехватываю исключения следующим образом:

 import pandas as pd import pymysql import getpass def myGetData(myQuery): myServer = 'xxx.xxx.xxx.xxx' myUser = input("Enter MySQL database username: ") myPwd = getpass.getpass("Enter password: ") try: myConnection = pymysql.connect(host=myServer,user=myUser,password=myPwd) except pymysql.OperationalError as e: # Catching this exception works fine if, for example, # I enter the wrong username and password print("\nAn OperationalError occurred. Error number {0}: {1}.".format(e.args[0],e.args[1])) try: myTempDF = pd.io.sql.read_sql(myQuery, con=myConnection) except pymysql.OperationalError as e: # However, this error isn't picked up following an incorrect # SQL query despite the error message saying that an # OperationalError has occurred. # Many variations on this theme have been tried but failed. print("\nAn error occurred. Error number {0}: {1}.".format(e.args[0],e.args[1])) myConnection.close() return myTempDF myDF = myGetData("SELECT * FROM `myDB`.`myTable`") 

Хороший вопрос, примечание, read_sql – это обертка вокруг 'read_sql_table и read_sql_query. Чтение через источник , ValueError последовательно выбрасывается внутри родительской и вспомогательной функций. Таким образом, вы можете безопасно поймать ValueError и обработать соответствующим образом. (Посмотрите на источник)