如题,找了好多帖子没有找到办法! 使用 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()
1
rationa1cuzz 2021-05-07 16:36:33 +08:00 1
不应该去找为什么网络断开程序会直接退出吗?这不相当于进程直接被 kill 了吗?这咋么搞,除非你有另一个监控进程
|
2
ch2 2021-05-07 16:53:04 +08:00
有可能是在前面就异常了
|
3
qile1 OP @rationa1cuzz 这个是 python 脚本,网上说是因为数据库链接断开,但是引用还存在,指向了不存在的内存地址导致程序崩溃,捕获不到异常!
我是数据库建立连接后,开始循环逐条插入数据,最后再关闭数据库连接,在这个过程中如果网络断开下就会程序程序整个崩溃。 |
4
joApioVVx4M4X6Rf 2021-05-08 10:21:00 +08:00
db.rollback()
db.close() 这两个没有 try catch |
5
qile1 OP @v2exblog 不是这个原因吧,我在 cursor.fetchone ()打断点,执行到这里,拔掉网线打开数据库连接,在执行代码,程序未运行到 except 就直接报错退出
|
6
hahaba 2021-05-08 16:18:38 +08:00
带的有个 ping 函数不知道吗
|
7
joApioVVx4M4X6Rf 2021-05-08 16:55:10 +08:00
@qile1 解决了吗,我也非常想知道是怎么回事
|
8
qile1 OP @xunbug pymysql 有 ping 函数,但是连接微软 sql server 的 pymssql 没有这个功能
|
9
qile1 OP 有高手了解不?
|
10
qile1 OP 这个其实是 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) |
11
qile1 OP sql server 也有检测机制,select 1 就可以,但是异常是随机的某个时间点,尤其是在耗时间的查询更新时候,数据库链接突然端口就会把程序搞崩溃,这个好像无解
|
12
qile1 OP 也能用遇到这个问题的朋友,给个解决办法
|