如何捕获特定于包的异常?

问题描述 投票:0回答:1

当我尝试使用

pandas.read_sql
从带有 pandas 的 SQL 数据库中读取表时,pyodbc 包会抛出一个我想捕获的
DataError
(pyodbc.DataError)。
DataError
是由意外的nvarchar值引起的,导致pyodbc尝试将其转换为int数据类型时转换失败。

这是我的代码:

import pandas as pd 
import pyodbc
from sqlalchemy import create_engine
from sqlalchemy.engine import URL

driver = "SQL Server"
server = "my_server" 
database = "my_db" 

connection_string = (f"Driver={driver};"
                     f"Server={server};"
                     f"Database={database};"
                     f"Trusted_Connection=yes;"
                     f"TrustServerCertificate=yes")

connection_url = URL.create("mssql+pyodbc", 
                            query={"odbc_connect": connection_string})

engine = create_engine(connection_url)

# select only the first 10 rows in a table 
query = (f"SELECT top 10 * "
         f"FROM abc.table_name")

df = pd.read_sql(sql=query, 
             con=engine)

输出是

DataError: (pyodbc.DataError) ('22018', "[22018] [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting the nvarchar value '00:35' to data type int. (245) (SQLExecDirectW)")
[SQL: SELECT top 10 * FROM abc.table_name]
(Background on this error at: https://sqlalche.me/e/14/9h9h)

我知道如何在 Python 中使用 tryexcept 语句来

捕获和处理
内置异常
。然而
DataError
(pyodbc.DataError) 不是内置异常。我想捕获这个特定于包的错误,而不仅仅是捕获any错误(我理解这是不好的做法)。

我已尝试以下操作:

try: 
    df = pd.read_sql(sql=query, 
                 con=engine)
except DataError as err: 
    print(err)
    pass

这会导致

NameError: name 'DataError' is not defined
(据我了解,因为
DataError
不是内置异常)。

我还尝试过以下方法:

try: 
    df = pd.read_sql(sql=query, 
                 con=engine)
except pyodbc.DataError as err: 
    print(err)
    pass

这会导致

DataError: (pyodbc.DataError)
,因为错误未被捕获。

python pandas exception pyodbc
1个回答
0
投票

DataError
似乎是SQLalchemy的例外,请参阅文档:https://docs.sqlalchemy.org/en/20/core/exceptions.html#sqlalchemy.exc.DataError

尝试:

from sqlalchemy.exc import DataError

然后

try:
    df = pd.read_sql(sql=query, 
                 con=engine)
except DataError as err: 
    print(err)
    pass
© www.soinside.com 2019 - 2024. All rights reserved.