pymssql 在插入数据库操作时候网络断开应该如何捕获异常?

2021-05-07 13:53:55 +08:00
 qile1

如题,找了好多帖子没有找到办法! 使用 try: except: 无法捕获异常,程序直接退出,我代码如下:

try:
    db = pymssql.connect(host='127.0.0.1',user='sa',password='sa',database='temp',charset='cp936')
    state=0
except pymssql.OperationalError:
    pass
except TypeError:
    pass
    #传参错误
except pymssql.InterfaceError:
    pass
except Exception as e:
    traceback.print_exc()
    print(e)
cursor = db.cursor()
try:
    # 执行 sql 语句
    sql="""SELECT * FROM xm_info"""
    cursor.execute(sql) # 如果执行到此处发生网络断开,程序直接异常退出,下面异常捕获无数据
    result = cursor.fetchone()
    cursor.execute(sql2) # 如果执行到此处发生网络断开,程序直接异常退出,下面异常捕获无数据
    result2 = cursor.fetchone()
    cursor.execute(sql3) # 如果执行到此处发生网络断开,程序直接异常退出,下面异常捕获无数据
    result3 = cursor.fetchone()
    
except: 
    # 输出异常信息,此处如果网络断开无法捕获异常
    traceback.print_exc()
    # 如果发生异常,则回滚
    db.rollback()
finally:
    # 最终关闭数据库连接
    db.close()
1473 次点击
所在节点    Python
12 条回复
rationa1cuzz
2021-05-07 16:36:33 +08:00
不应该去找为什么网络断开程序会直接退出吗?这不相当于进程直接被 kill 了吗?这咋么搞,除非你有另一个监控进程
ch2
2021-05-07 16:53:04 +08:00
有可能是在前面就异常了
qile1
2021-05-07 21:11:15 +08:00
@rationa1cuzz 这个是 python 脚本,网上说是因为数据库链接断开,但是引用还存在,指向了不存在的内存地址导致程序崩溃,捕获不到异常!
我是数据库建立连接后,开始循环逐条插入数据,最后再关闭数据库连接,在这个过程中如果网络断开下就会程序程序整个崩溃。
0x0208v0
2021-05-08 10:21:00 +08:00
db.rollback()

db.close()

这两个没有 try catch
qile1
2021-05-08 15:09:14 +08:00
@v2exblog 不是这个原因吧,我在 cursor.fetchone ()打断点,执行到这里,拔掉网线打开数据库连接,在执行代码,程序未运行到 except 就直接报错退出
hahaba
2021-05-08 16:18:38 +08:00
带的有个 ping 函数不知道吗
0x0208v0
2021-05-08 16:55:10 +08:00
@qile1 解决了吗,我也非常想知道是怎么回事
qile1
2021-05-08 22:01:18 +08:00
@xunbug pymysql 有 ping 函数,但是连接微软 sql server 的 pymssql 没有这个功能
qile1
2021-05-12 00:18:02 +08:00
有高手了解不?
qile1
2022-03-27 22:37:58 +08:00
这个其实是 python 解释器崩溃啦,因为数据库异常断开后,python 程序不知道是否断开,程序在访问的时候其实是访问一个不存在的内存地址,导致 window 系统程序保护报错


错误应用程序名称: python.exe ,版本: 3.6.8150.1013 ,时间戳: 0x5c201b63
错误模块名称: python36.dll ,版本: 3.6.8150.1013 ,时间戳: 0x5c201ad5
异常代码: 0xc0000005
错误偏移量: 0x0011493c
错误进程 ID: 0x1990
错误应用程序启动时间: 0x01d8418405083fe9

[![qBc6De.png]( https://s1.ax1x.com/2022/03/27/qBc6De.png)]( https://imgtu.com/i/qBc6De)
qile1
2022-03-27 22:44:02 +08:00
sql server 也有检测机制,select 1 就可以,但是异常是随机的某个时间点,尤其是在耗时间的查询更新时候,数据库链接突然端口就会把程序搞崩溃,这个好像无解
qile1
2022-04-02 22:39:38 +08:00
也能用遇到这个问题的朋友,给个解决办法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/775418

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX