【问题标题】:Python Logging Multiple Errors on Single LinePython 在单行上记录多个错误
【发布时间】:2020-10-10 05:40:18
【问题描述】:

我正在尝试记录一些预期的错误。

最初,我编写的脚本如下:

   except (BadZipFile, MemoryError) as e:
       logger.error(f'No: {n} - {filename} = {e}')

但我在记录器中注意到,似乎只有 BadZipFile 错误消息。 MemoryError 日志在 = 符号之后似乎是空白的

我认为e 可能只存储了BadZipFile 错误消息,因为它首先出现,所以我尝试制作一个元组:

   except (BadZipFile, MemoryError) as (eb, em):
       logger.error(f'No: {n} - {filename} = {eb, em}')

当然,语法是错误的。那么我的代码最初出了什么问题?为什么MemoryError 日志没有存储?

【问题讨论】:

  • 我注意到了同样的事情。 MemoryError 的字符串表示是一个空格。我想原因是如果系统内存不足,它就没有空间告诉你出了什么问题。
  • 您处理该错误的方式没有任何问题。这只是意味着内存错误的消息是空白的。你有任何迹象表明它应该是其他的吗?
  • 没有理由不这么想,只是不知道。很高兴知道。我可以添加一个条件,如果 e 为空白,则用适当的文本填充它。

标签: python logging error-handling


【解决方案1】:

首先发生的异常将被捕获在 except 块中。所以,我认为在你的情况下,第一个异常引发是 BadZipFile。请参阅@LMKR 示例。

尝试显式引发异常以检查它是否正常工作...

>>> try:
...     if True:
...         raise MemoryError("MemoryError occured")
... except (BadZipFile, MemoryError) as e:
...     print(e)

【讨论】:

    【解决方案2】:

    程序的执行将在发生异常时停止并移动到except块。因此,当发生异常时,不可能在同一个 try 块中获得另一个异常。所以总是会收到一个异常日志。

    让我用一些代码解释一下,考虑我们有两种类型的错误,IndexErrorZeroDivisionError

    案例1:

    >>> l = []
    >>> a = 1
    >>> b = 0
    >>> try:
    ...     x = l[0]
    ...     y = a/b
    ... except (IndexError, ZeroDivisionError) as e:
    ...     print(e)
    ...
    list index out of range
    

    案例2:

    >>> try:
    ...     x = a/b
    ...     y = l[0]
    ... except (IndexError, ZeroDivisionError) as e:
    ...     print(e)
    ...
    division by zero
    

    案例3:

    >>> try:
    ...     x = l[0]/b
    ... except (IndexError, ZeroDivisionError) as e:
    ...     print(e)
    ...
    list index out of range
    >>>
    

    Case1,IndexError 首先引发,所以除了 bock 是用 IndexError 调用的
    Case2,ZeroDivisionError 首先引发,所以除了块被 ZeroDivisionError 调用
    案例 3,即使两个异常都在单行执行中,也发生在索引中,因此引发了 IndexError。

    编辑:

    在您的情况下,首先引发 BadZipFile 异常,因此您的 except 块 except (BadZipFile, MemoryError) as e: 使用 BadZipFile 异常调用。这就是为什么 MemoryError 的输出为空的原因。

    即使MemoryError 首先使用空参数引发,它也不会记录任何内容。

    >>> try:
    ...     raise MemoryError("This is memory error")
    ... except MemoryError as e:
    ...     print(e)
    ...
    This is memory error
    >>> try:
    ...     raise MemoryError()
    ... except MemoryError as e:
    ...     print(e)
    ...
    
    >>> 
    

    【讨论】:

    • 也许您可以在此添加一条 MemoryError 消息为空白的注释,以便我可以将其标记为综合解决方案。谢谢你写这篇文章。
    • 现在已经非常接近完全正确了。事实证明 MemoryError 只返回一个空白空间。这就是我的输出在遇到 MemoryError 时为空的原因。即使没有 BadZipFile 错误是否存在?您能否在底部更新您的编辑,以便我奖励解决方案正确?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多