【问题标题】:Catch an exception in python... but still continue在 python 中捕获异常......但仍然继续
【发布时间】:2019-10-02 18:13:36
【问题描述】:

tl;dr我使用try: ... except Exception as err: pass,但在引发异常时代码仍会停止,即使它不应该。

我正在 csv 上运行转换算法。其中一种转换考虑了数据库中列值的存在。如果它不存在,我会提出这样的异常:

2019-05-15 16:36:37,095 - root - WARNING - The data in 'section_code' either doesn't exist in the raw data or hasn't been correctly encoded. The following strings caused the encoding error : '['398', 'die']'

我知道使用 try: ... except: pass 的这种做法不好,但我希望我的代码继续转换文件,同时只记录出现的错误/警告。

下面是我的代码在 try...except 块中的封装方式

if __name__ == "__main__":
    try:
        # Initiate logger
        logging.basicConfig(
            level="DEBUG",
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

        # Business code ...

    except FileNotFoundError as f_err:
        logging.exception(f_err)
    except AzureMissingResourceHttpError as az_err:
        logging.exception(az_err)
    except TypeError as t_err:
        pass
        logging.warning(t_err)

所以我的问题是:为什么pass 语句没有想要的效果,我该如何实现这种行为?

【问题讨论】:

  • pass 确实是当需要语句时的占位符代码,但您还没有编码它们。如果您只是向记录器抛出异常,为什么不直接删除 pass 语句?
  • 可以去掉pass语句。
  • 你要的是Visual Basic的on error resume next,而Python中没有这种东西。 (这是一件好事;它迫使您思考错误可能发生的确切位置,以及应该如何处理它们。)

标签: python exception logging


【解决方案1】:

当异常发生时,代码立即跳转到异常处理程序并在异常发生之后继续执行代码。它不会返回并从代码中中断的地方继续。

要修复,您必须在要忽略异常的代码行周围限制 try/except。

【讨论】:

  • 也就是说,每当我想实现记录但不停止的行为时,我必须封装正确的代码行而不是全局调用函数?这真的很乏味!有没有办法让它变得聪明?
  • 如果你只有一个全局函数在错误时中止,并且你不能改变函数的内部,不。 except 必须在允许算法继续的位置捕获错误。例如,try/except 不能包含for line in file: do_something('line'),它必须只包含do_something('line')。然后,如果它失败了,它仍然可以继续下一行。
猜你喜欢
  • 2018-05-05
  • 1970-01-01
  • 2012-09-15
  • 2017-04-04
  • 2021-10-29
  • 2020-07-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多