Можно ли оценить несколько условий в блоке try в Python. Ниже случай. У меня есть 2 условия ниже.
В данный момент думаю сделать так. Есть ли более элегантный способ.
try:
#Condition 1
except:
#Condition 1
try:
#Condition 2
except:
#Condition 2
else:
#Condition 3
def connect_to_server(table):
# Connection Code
server = ''
username = ''
password = ''
database = ''
cnxn = pyodbc.connect('DRIVER = {ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';ENCRYPT=yes;UID='+username+';PWD='+ password)
cnxn.timeout = 5
cursor = cnxn.cursor()
try:
cnxn.execute('SELECT * FROM ' +table)
except Exception as my_timeout_exception:
raise my_timeout_exception
def read_database(table):
server = ''
username = ''
password = ''
database = ''
cnxn = pyodbc.connect('DRIVER = {ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';ENCRYPT=yes;UID='+username+';PWD='+ password)
cursor = cnxn.cursor()
df = pd.read_sql('SELECT * FROM ' +table, cnxn)
if df.empty:
print("dataframe is empty")
else:
return df
try:
using_con = connect_to_server('table')
df = read_database('table')
except my_timeout_exception:
handle_error_1
#break
except empty_df_exception:
handle_error_2
#break
else:
print("z")
RЕсли вы просто хотите зафиксировать различные состояния ошибок, вы можете включить свой код для подключения к серверу, а затем проверить данные в инструкции try. затем вы указываете ошибку, которую хотите поймать, в операторе exclude:
def connect_to_server(db):
# Connection Code
if connection_timed_out:
raise my_timeout_exception #either a custom error you have created or propagate standard error from connection timeout
return connection
def read_database(conn):
#read db into dataframe code
if dataframe_isempty:
raise empty_df_exception #either a custom error you have created or propagate standard error from dataframe reading
return dataframe
try:
using_con = connect_to_server(db)
df = read_database(using_con)
except my_timeout_exception:
handle_error_1
break
except empty_df_exception:
handle_error_2
break
else:
continue_code
На самом деле вы можете включить оба исключения в один оператор exclude, если код обработки один и тот же (например, только оператор break).
Похоже, что исключение, которое вы пытаетесь зафиксировать, не распознано как правильное исключение. Если вы используете пользовательское исключение (то есть созданное вами), обратите внимание, что пользовательское исключение должно быть классом, унаследованным от стандартного класса Exception. Если это не помогает или вы этого не понимаете, опубликуйте простой пример кода, который дает вам эту ошибку. Также прочитайте stackoverflow.com/questions/1319615/…, чтобы дать вам некоторые рекомендации по созданию пользовательских исключений.
Я отредактировал код, пожалуйста, помогите мне понять.
К счастью, pyodbc предлагает свои собственные классы ошибок, поэтому нет необходимости создавать собственный класс, однако мы создаем собственную ошибку для пустого фрейма данных:
import pyodbc
import pandas as pd
class MyEmptyDfError(Exception):
def __init__(self):
message = "Dataframe is empty"
super().__init__(message)
def connect_to_server():
# Connection Code
server = ''
username = ''
password = ''
database = ''
cnxn = pyodbc.connect('DRIVER = {ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';ENCRYPT=yes;UID='+username+';PWD='+ password)
return cnxn
def read_database(table, cnxn):
cnxn.timeout = 5
df = pd.read_sql('SELECT * FROM ' + table, cnxn)
if df.empty:
raise MyEmptyDfError
return df
try:
conn = connect_to_server()
df = read_database("test_table", conn)
except pyodbc.OperationalError as e:
print(e)
except MyEmptyDfError as e:
print(e)
finally:
print("Final code reached")
Здесь, если соединение с сервером вызывает ошибку, она распространяется на ваш код и фиксируется как OperatioalError (я думаю, что ошибка возникает, если время ожидания истекло) Я думаю, что это должно работать (еще не было возможности проверить это)
Спасибо за ответ. Я попробовал предложенный вами подход с помощью простых математических операций. Я получаю следующую ошибку. TypeError: не допускается отлов классов, которые не наследуются от BaseException