首页 > 解决方案 > 有没有办法将多行代码放在 try except 块中,然后按顺序运行,即使抛出错误?

问题描述

我正在做一些数据分析并在 CSV 文件中创建新列。有时,当我遍历 pandas 数据框中的行时,会出现零除错误。发生这种情况时,我转到下一行。

更清洁的代码:

try:
    self.sf1.loc[ind, 'quick'] = (row['assets'] - row['inventory']) / row['liabilities']  # Quick
    self.sf1.loc[ind, 'current'] = row['assets'] / row['liabilities']  # Current
    self.sf1.loc[ind, 'financial_lev'] = row['debt'] / row['equity']  # Financial Lev

except ZeroDivisionError:
    continue

上面的代码比下面在功能上工作的其他方式更容易和更干净。唯一的问题是,如果任何代码行抛出 a ZeroDivisionError,那么其他代码行都不会运行。

不干净的解决方案:

try:
    self.sf1.loc[ind, 'quick'] = (row['assets'] - row['inventory']) / row['liabilities']  # Quick
except ZeroDivisionError:
    continue
try:
    self.sf1.loc[ind, 'current'] = row['assets'] / row['liabilities']  # Current
except ZeroDivisionError:
    continue
try:
    self.sf1.loc[ind, 'financial_lev'] = row['debt'] / row['equity']  # Financial Lev
except ZeroDivisionError:
    continue

有没有办法做一些更类似于第一个代码气泡的事情,同时确保每一行代码都运行,即使上面的代码抛出错误?顺便说一句,这个尝试,除了块是在熊猫iterrows()循环中。

标签: pythonpython-3.xpandasexceptiontry-catch

解决方案


不,没有:这是try-except范围的语义定义。

我不明白您对使用多个 PANDAS 矢量化的抱怨,因为两个代码示例都使用相同的。唯一的区别是异常处理和延续。

使用您当前的代码,请注意,如果您在第 4 行达到零除法,则第 5 行底部将保持不变。如果您需要面向行的继续控制,那么您必须明确执行所有所需的除法,检查每个单独操作的异常,而不是整个向量。


推荐阅读