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

标签 python mysql exception error-handling

想象以下代码:

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/

相关文章:

python - 如何在一个项目中使用多个 conda 环境

c# - 异步使用 MySQL 数据库

php - 为什么我不应该在 PHP 中使用 mysql_* 函数?

python - Ruby on Rails 与 Python

python - Sympy:求解微分方程

sql - MySQL:每个帖子的最新评论

java - 解析 JSON 时出错,但代码看起来没问题

postgresql - postgresql嵌套异常可能吗?

c++ - VS Test Explorer为什么不显示我的C++自定义异常消息?

python - 我无法在 Django 项目的虚拟环境中安装 django-allauth?