gpt4 book ai didi

python - 为什么在没有Except block 的情况下Python仍会引发异常?

转载 作者:行者123 更新时间:2023-12-03 08:04:56 25 4
gpt4 key购买 nike

想象以下代码:

def query(sql, data):
with conn as cursor:
try:
cursor.execute(sql, data)
rows = cursor.fetchall()
conn.commit()
except Exception as e:
print(cursor._last_executed)
print(e)

调用它时,从最后一行开始出现 err.InterfaceError("(0, '')"): print(e)

如果它是从 print(cursor._last_executed)升起的,我什至可以理解,因为 cursor可能不可用或其他原因。但这种情况并非如此。

为什么,当我的绝对异常(exception)应该处理所有事情时?

请忽略讨论,无论是好的异常(exception)还是好的做法,这都是另一个主题。问题是,在这种情况下,异常是怎么引起的。

编辑:在数据库负载沉重的情况下,很少出现异常。您将无法复制它。

Edit2 :我设法将回溯复制为哨兵报告中的文本:
InterfaceError: (0, '')
File "run_signal_generator.py", line 39, in <module>
main()
File "run_signal_generator.py", line 35, in main
ds.run_trades_stream()
File "/home/deribit/rubber-band/data_stream/data_streamer.py", line 223, in run_trades_stream
self.process_data(data)
File "/home/deribit/rubber-band/data_stream/data_streamer.py", line 97, in process_data
self.start_new_candle(timeframe)
File "/home/deribit/rubber-band/data_stream/data_streamer.py", line 117, in start_new_candle
self.notify()
File "/home/deribit/rubber-band/data_stream/observer.py", line 13, in notify
observer.update()
File "/home/deribit/rubber-band/data_stream/observer.py", line 26, in update
self.process_data()
File "/home/deribit/rubber-band/data_stream/signal_generator.py", line 131, in process_data
return self.process_potential_new_trade()
File "/home/deribit/rubber-band/data_stream/signal_generator.py", line 160, in process_potential_new_trade
return self.process_enter_signal()
File "/home/deribit/rubber-band/data_stream/signal_generator.py", line 407, in process_enter_signal
trade_id = self.store_enter_signal_db(data)
File "/home/deribit/rubber-band/data_stream/signal_generator.py", line 522, in store_enter_signal_db
return query(sql, db_data)["id"]
File "/home/deribit/rubber-band/helpers/mysql.py", line 19, in query
print(e)
File "pymysql/connections.py", line 881, in __exit__
self.commit()
File "pymysql/connections.py", line 798, in commit
self._execute_command(COMMAND.COM_QUERY, "COMMIT")
File "pymysql/connections.py", line 1122, in _execute_command
raise err.InterfaceError("(0, '')")

实际上,它声称异常(exception)是从这条线引起的。

最佳答案

似乎类似于this old question:mysql连接和游标不是线程安全的,因此,如果您在多个线程之间共享连接(而不是每个线程有一个连接),则它们的状态基本上可以在任何时候中断。

由于某种原因,MySQL的连接错误__str__可能会ping通服务器以尝试获取更多信息,如果例如另一个线程已经更改了连接状态。 cursor._last_executed可能不会出现此问题,因为在执行请求或响应返回时仅将信息保存在本地即可。

正如其他评论者所指出的,如果您遇到异常,请提供整个追溯和错误消息,而不是信息的一小部分。如果您需要匿名化部分回溯,则可以这样做,但ESP或假设所需的次数越少越好。

关于python - 为什么在没有Except block 的情况下Python仍会引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59856128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com