首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从PyMSSQL捕获异常

如何从PyMSSQL捕获异常
EN

Stack Overflow用户
提问于 2018-02-05 01:08:03
回答 2查看 6.9K关注 0票数 4

我正在使用PyMSSQL连接到一个数据库。但是,如果我输入了不正确的详细信息或存在其他问题,PyMSSQL将抛出异常。但是,我不知道如何捕捉异常。我已经使用了我能想到的每一种变体,但我似乎无法以一种优雅的方式捕捉到异常。

我的连接代码是:

代码语言:javascript
复制
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")

如果我在输入字段中输入胡言乱语,我会得到以下输出:

代码语言:javascript
复制
---------------------------------------------------------------------------
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异常的问题,但是我尝试了所有的变体,但都没有成功。

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

EN

回答 2

Stack Overflow用户

发布于 2018-02-05 07:51:25

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

代码语言:javascript
复制
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生成的异常,如注释中的match所提示的那样。(但是,在这种情况下,随后将数据导入到Pandas数据帧中会出现问题,因为_mssql没有游标属性。)

代码语言:javascript
复制
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)

希望这对其他人有用。

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

票数 2
EN

Stack Overflow用户

发布于 2018-02-05 01:43:53

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48610782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档