Оценка нескольких условий в блоке try в Python

Можно ли оценить несколько условий в блоке try в Python. Ниже случай. У меня есть 2 условия ниже.

  1. Подключитесь к серверу sql, чтобы прочитать данные в два фрейма данных. В коде есть тайм-аут, если соединение занимает более 15 секунд, код должен вызвать исключение и выйти.
  2. Проверьте, есть ли у этих двух фреймов данных данные. Если один из фреймов данных пуст, выйдите из кода, если нет, продолжите код в блоке else.

В данный момент думаю сделать так. Есть ли более элегантный способ.

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")
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
0
0
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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).

Спасибо за ответ. Я попробовал предложенный вами подход с помощью простых математических операций. Я получаю следующую ошибку. TypeError: не допускается отлов классов, которые не наследуются от BaseException

SanjanaSanju 11.01.2023 02:27

Похоже, что исключение, которое вы пытаетесь зафиксировать, не распознано как правильное исключение. Если вы используете пользовательское исключение (то есть созданное вами), обратите внимание, что пользовательское исключение должно быть классом, унаследованным от стандартного класса Exception. Если это не помогает или вы этого не понимаете, опубликуйте простой пример кода, который дает вам эту ошибку. Также прочитайте stackoverflow.com/questions/1319615/…, чтобы дать вам некоторые рекомендации по созданию пользовательских исключений.

Galo do Leste 11.01.2023 02:33

Я отредактировал код, пожалуйста, помогите мне понять.

SanjanaSanju 11.01.2023 03:24
Ответ принят как подходящий

К счастью, 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 (я думаю, что ошибка возникает, если время ожидания истекло) Я думаю, что это должно работать (еще не было возможности проверить это)

Другие вопросы по теме