【问题标题】:How to catch exceptions from PyMSSQL如何从 PyMSSQL 中捕获异常
【发布时间】:2018-07-14 14:43:16
【问题描述】:

我正在使用 PyMSSQL 连接到数据库。但是,如果我输入了错误的详细信息或有其他问题,PyMSSQL 会引发异常。但是,我无法弄清楚如何捕获异常。我已经使用了我能想到的所有变体,但我似乎无法以优雅的方式捕捉到异常。

我的连接代码是:

import pymssql
import getpass

tempServer = input("Enter host: ")
tempUser = input("Enter user: ")
tempPwd = getpass.getpass("Enter password: ")

try:
    phjTempConnection = pymssql.connect(server = tempServer,
                                        user = tempUser,
                                        password = tempPwd,
                                        port = '1433')
except pymssql.MSSQLDatabaseException:
    print("ERROR")

如果我在输入字段中输入废话,我会得到以下输出:

---------------------------------------------------------------------------
MSSQLDatabaseException                    Traceback (most recent call last)
pymssql.pyx in pymssql.connect (pymssql.c:10734)()

_mssql.pyx in _mssql.connect (_mssql.c:21821)()

_mssql.pyx in _mssql.MSSQLConnection.__init__ (_mssql.c:6581)()

_mssql.pyx in _mssql.maybe_raise_MSSQLDatabaseException (_mssql.c:17524)()

MSSQLDatabaseException: (18456, b'Unknown error')

During handling of the above exception, another exception occurred:

OperationalError                          Traceback (most recent call last)
<ipython-input-21-22d7fd0e3d05> in <module>()
     11                                         password = tempPwd,
---> 12                                         port = '1433')
     13 except pymssql.MSSQLDatabaseException:

pymssql.pyx in pymssql.connect (pymssql.c:10824)()

OperationalError: (18456, b'Unknown error')

During handling of the above exception, another exception occurred:

AttributeError                            Traceback (most recent call last)
<ipython-input-21-22d7fd0e3d05> in <module>()
     11                                         password = tempPwd,
     12                                         port = '1433')
---> 13 except pymssql.MSSQLDatabaseException:
     14     print("ERROR")

AttributeError: 'module' object has no attribute 'MSSQLDatabaseException'

我原以为输出会提供足够的信息来解决如何捕获 MSSQLDatabaseException 异常,但我尝试了各种变体,但都没有成功。

如何使用输出来确定如何捕获引发的异常?

【问题讨论】:

    标签: sql-server python-3.x exception-handling pymssql


    【解决方案1】:

    文档暗示该异常是_mssql 模块的一部分,因此您可能需要在此处捕获_mssql.MSSQLDatabaseException

    http://pymssql.org/en/stable/_mssql_examples.html

    【讨论】:

    • 感谢您的回答。我已经尝试了所有能找到的版本,包括 _mssql,但我似乎仍然无法捕捉到该异常。
    • 我玩了更多,导入 _mysql,将代码从 pymssql.connect() 更改为 _mssql.connect() 并捕获 _mysql.MssqlDatabaseException 和 _mysql.MssqlDriverException 似乎工作但我仍然无法捕获 pymssql.connect() 生成的异常。
    【解决方案2】:

    经过一番探索,我找到了一个合理的解决方案。使用原始问题中列出的代码(使用 pymssql.connect() ),引发了两个潜在的异常。如果输入了正确的服务器地址但用户名或密码不正确,则会引发 MSSQLDatabaseException。但是,如果服务器地址不正确,则会引发 MSSQLDriverException(但请参阅末尾的注释)。要从这些错误中优雅退出,似乎有必要捕获 pymssql.InterfaceError(捕获 MSSQLDriverException)和 pymssql.DatabaseError(捕获 MSSQLDatabaseError)。

    import pymssql
    import getpass
    
    tempServer = input("Enter host: ")
    tempUser = input("Enter user: ")
    tempPwd = getpass.getpass("Enter password: ")
    
    try:
        phjTempConnection = pymssql.connect(server = tempServer,
                                            user = tempUser,
                                            password = tempPwd,
                                            port = '1433')
    except pymssql.InterfaceError:
        print("A MSSQLDriverException has been caught.")
    
    except pymssql.DatabaseError:
        print("A MSSQLDatabaseException has been caught.")
    

    或者,可以捕获使用 _mysql 生成的异常,如 cmets 中的匹配所暗示的那样。 (但是,在这种情况下,随后将数据导入 Pandas 数据框时会出现问题,因为 _mssql 没有 Cursor 属性。)

    import pymssql
    import _mssql
    import getpass
    
    tempServer = input("Enter host: ")
    tempUser = input("Enter user: ")
    tempPwd = getpass.getpass("Enter password: ")
    
    try:
        phjTempConnection = _mssql.connect(server = tempServer,
                                           user = tempUser,
                                           password = tempPwd,
                                           port = '1433')
    
    except _mssql.MssqlDriverException:
        print("A MSSQLDriverException has been caught.")
    
    except _mssql.MssqlDatabaseException as e:
        print("A MSSQLDatabaseException has been caught.")
        print('Number = ',e.number)
        print('Severity = ',e.severity)
        print('State = ',e.state)
        print('Message = ',e.message)
    

    希望对其他人有用。

    (NB 如果 SQL SERVER 的地址在第一次运行这些函数时输入错误,则会引发 MSSQLDriverException。如果输入了正确的服务器地址(但用户和密码不正确),则会引发 MSSQLDatabaseException . 但是,如果随后输入了错误的服务器,则会继续引发 MSSQLDatabaseException 而不是第一种情况下的 MSSQLDriverException。)

    【讨论】:

    • import _mssql 可以更改为 from pymssql import _mssql
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多