Python在单行上记录多个错误

Python在单行上记录多个错误,python,logging,error-handling,Python,Logging,Error Handling,我正在尝试记录一些预期的错误 最初,我写的脚本如下: except (BadZipFile, MemoryError) as e: logger.error(f'No: {n} - {filename} = {e}') 但我注意到,在日志中,似乎只有BadZipFile错误消息才成功。=符号后,内存错误日志似乎为空 我想可能是e只存储了BadZipFile错误消息,因为它是第一个出现的,所以我尝试创建一个元组: except (BadZipFile, MemoryEr

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

最初,我写的脚本如下:

   except (BadZipFile, MemoryError) as e:
       logger.error(f'No: {n} - {filename} = {e}')
但我注意到,在日志中,似乎只有
BadZipFile
错误消息才成功。
=
符号后,
内存错误
日志似乎为空

我想可能是
e
只存储了
BadZipFile
错误消息,因为它是第一个出现的,所以我尝试创建一个元组:

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

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

当发生异常时,程序的执行将停止,并移动到except块。因此,当发生异常时,不可能在同一
try
块中获取另一个异常。So将始终收到一个异常日志

让我用一点代码解释一下,考虑我们有两种类型的错误,<代码>索引错误和<代码> 案例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
>>>
案例1,首先引发IndexError,因此使用IndexError调用except bock
案例2,首先引发ZeroDivisionError,因此使用ZeroDivisionError调用Exception块
案例3,即使这两个异常都在单行中,执行的行也会从索引中发生,因此会引发IndexError

编辑:

在您的案例中,首先引发了
BadZipFile
异常,因此将使用
BadZipFile
异常调用exception块
exception(BadZipFile,MemoryError)作为e:
。这就是为什么
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)
...

>>> 

无论哪个异常首先发生,都将被捕获到块中。所以,我认为在你的情况下,第一个例外是BadZipFile。参考@LMKR示例

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

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

我也注意到了同样的事情。MemoryError的字符串表示形式是空白。我想原因是,如果系统内存不足,它没有任何空间告诉您出了什么问题。您处理错误的方式没有问题。这仅仅意味着内存错误的消息是空的。你有没有任何迹象表明应该是另外一种情况?没有理由不这样想,只是不知道而已。很高兴知道。我可以添加一个条件,如果e是空的,用适当的文本填充它。也许你可以添加一个备注,MemoryError消息也是空的,这样我就可以把它标记为一个全面的解决方案。谢谢你写这篇文章。现在这已经接近完全正确了。事实证明,MemoryError只返回一个空白。这就是为什么每当遇到MemoryError时,我的输出都是空的。即使没有BadZipFile错误,是否存在?你能更新底部的编辑吗?这样我就可以奖励正确的解决方案了?