【发布时间】:2020-05-08 09:37:41
【问题描述】:
想象一下下面的代码:
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 可能不可用或其他什么。但事实并非如此。
为什么,当我的裸异常应该处理所有事情时?
请忽略关于裸异常是好还是坏的讨论,这是另一个话题。问题是在这种情况下,异常是怎么产生的。
编辑:在繁重的数据库负载下,异常很少出现。您将无法复制它。
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, '')")
确实,它声称异常是从这条线引发的。
【问题讨论】:
-
你的裸异常块正在处理一切。只是在处理它时,引发了另一个异常。这里的相关讨论是为什么异常在尝试打印时引发异常。
-
你确定错误是在
print(e)引发,而不是简单地打印那里? -
一个完整的追溯在这里会有所帮助...
-
没有可用的通用回溯。我有一个哨兵回溯,我将其作为图像文件上传,并获得了反对意见并建议将其删除。根据哨兵回溯,错误确实是从这条线上上升的。我唯一的解释是哨兵回溯是错误的,它是从上面的行升起的。
-
好的,我找到了原因 - 异常确实是从
print行引起的,如果您好奇,可以查看我的答案。
标签: python mysql exception error-handling