rxts 发表于 2025-1-26 10:24:38

设置了except Exception as e,程序不执行,还直接报错

'

    def update_date_zs_minute_jhjj(self, index):
      self.date = DF_DATE_LIST
      self.ZS = self.date_zs
      self.setWindowTitle(f'{self.name}{rs.date_zh(self.date)}')
      #上面的三句代码执行正确,没有任何问题
      try:
            # 文件路径是正确的,因为在self.date没有超出范围内,程序可以正常执行
            self.df_minute = pd.read_csv(f"D:/stock/minute/{self.code}/{self.date}.csv", encoding=de).values.tolist()
            self.df_jhjj = pd.read_csv(f"D:/stock/jhjj/{self.code}/{self.date}.csv", encoding=de).values.tolist()
      except Exception as e: #语句没有执行,程序直接报错,下面的print('a')语句也没有打印任何东西,except Exception as e:为什么没有执行
            print('a')
            self.df_minute = rs.tdx_history_trade(self.code, self.date)
            print(self.df_minute)
            self.df_jhjj = self.df_minute
            del self.df_minute
'

一下为报错内容:
Error calling Python override of QWidget::paintEvent(): Traceback (most recent call last):
File "D:\pycharmprojects\入戏太深软件\入戏太深股票\软件实验.py", line 893, in paintEvent
    minute_k(qp=qp, w=self.width(), h=self.height(), window_h=0.18, end=3, df_minute=self.df_minute
                                                                                     ^^^^^^^^^^^^^^
AttributeError: 'MinuteK' object has no attribute 'df_minute'

FishC 发表于 2025-1-26 10:24:55

问题分析和解决方案

根据你描述的代码和报错信息,问题的核心在于`except Exception as e`并没有被触发,原因可能有以下几种:


[*]1. 初始化的问题
`AttributeError: 'MinuteK' object has no attribute 'df_minute'`表明代码在调用`self.df_minute`时,`self.df_minute`尚未初始化,导致程序直接报错,而没有进入`try-except`块。这可能是因为`paintEvent`方法在调用时,`self.df_minute`未被正确赋值。
[*]2. 异常未发生在`try-except`块内
异常实际发生的位置并不在`try`块内,因此不会触发`except Exception as e`,所以打印`'a'`的语句也没有执行。
[*]3. 界面刷新逻辑问题
`paintEvent`方法是由PyQt框架回调的,而不是用户主动调用的。若该方法依赖于`self.df_minute`,但在调用前`update_date_zs_minute_jhjj`方法未正确初始化数据,也会导致报错。


代码改进建议

为了解决这个问题,可以采取以下措施:


[*]1. 初始化`self.df_minute`和其他可能未定义的变量
为避免属性在未定义的情况下被使用,可以在类的`__init__`方法中初始化这些属性。
[*]2. 确认异常来源
通过在`try`块中添加更多日志,确认哪个代码部分可能引发异常。
[*]3. 确保`paintEvent`方法调用前,数据已被正确加载
在调用绘图逻辑时,添加属性检查,确保所有依赖的数据都已正确初始化。


修改后的代码示例

以下是改进后的代码:


class MinuteK:
    def __init__(self, ...):
      # 初始化必要变量,避免未定义错误
      self.df_minute = None
      self.df_jhjj = None

    def update_date_zs_minute_jhjj(self, index):
      self.date = DF_DATE_LIST
      self.ZS = self.date_zs
      self.setWindowTitle(f'{self.name}{rs.date_zh(self.date)}')
      try:
            # 加载CSV文件
            self.df_minute = pd.read_csv(f"D:/stock/minute/{self.code}/{self.date}.csv", encoding=de).values.tolist()
            self.df_jhjj = pd.read_csv(f"D:/stock/jhjj/{self.code}/{self.date}.csv", encoding=de).values.tolist()
      except Exception as e:
            print(f"异常发生: {e}")
            self.df_minute = rs.tdx_history_trade(self.code, self.date)
            print(self.df_minute)
            self.df_jhjj = self.df_minute
            del self.df_minute

    def paintEvent(self, event):
      if not hasattr(self, 'df_minute') or self.df_minute is None:
            print("绘图依赖的数据尚未加载")
            return
      # 继续绘图逻辑...


代码关键点解释


[*]在`__init__`中初始化`self.df_minute`和`self.df_jhjj`为`None`,避免在未定义时直接使用。
[*]在`paintEvent`中进行数据检查,确保绘图所依赖的数据已被正确加载。
[*]在`try-except`块中增加日志,捕获和定位异常来源。


尝试上述修改后,如果还有问题,可以进一步提供上下文信息。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 设置了except Exception as e,程序不执行,还直接报错