EAFP 样式的错误消息
Error messages in EAFP style
"It's easier to ask for forgiveness than permission" 或 EAFP 是 Python 中的一种常见样式,其中编码人员编写预期错误的代码并使用错误处理来实现预期的流程控制。
我经常发现的问题是,这会导致错误消息令人困惑。考虑这个例子。
some_dict = {} # oops a bug, this should have 'expected key'
try:
some_dict['optional key'] # expected error
except KeyError:
some_dict['expected key'] # unexpected error
产生:
Traceback (most recent call last):
File "eafp.py", line 4, in <module>
some_dict['optional key'] # expected error
KeyError: 'optional key'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "eafp.py", line 6, in <module>
some_dict['expected key'] # unexpected error
KeyError: 'expected key'
具体来说,意外错误消息引用了预期错误消息。这是一个微不足道的例子,但在某些情况下,第一个错误可能是完全意料之中的,并不值得注意,但似乎与错误的真正原因密切相关,可能会引起一些混淆。
我的问题是如何最好地处理此类问题。可以抑制第一个错误消息吗?或者改成不那么显眼的东西?
对于任何疑惑,我最终使用以下(相当明显的)解决方案来提醒自己调试时。
import logging
logger = logging.getLogger(__name__)
some_dict = {} # oops a bug, this should have 'expected key'
try:
some_dict['optional key'] # expected error
except KeyError as err:
logger.info('Expected Error: %s', err)
some_dict['expected key'] # unexpected error
"It's easier to ask for forgiveness than permission" 或 EAFP 是 Python 中的一种常见样式,其中编码人员编写预期错误的代码并使用错误处理来实现预期的流程控制。
我经常发现的问题是,这会导致错误消息令人困惑。考虑这个例子。
some_dict = {} # oops a bug, this should have 'expected key'
try:
some_dict['optional key'] # expected error
except KeyError:
some_dict['expected key'] # unexpected error
产生:
Traceback (most recent call last):
File "eafp.py", line 4, in <module>
some_dict['optional key'] # expected error
KeyError: 'optional key'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "eafp.py", line 6, in <module>
some_dict['expected key'] # unexpected error
KeyError: 'expected key'
具体来说,意外错误消息引用了预期错误消息。这是一个微不足道的例子,但在某些情况下,第一个错误可能是完全意料之中的,并不值得注意,但似乎与错误的真正原因密切相关,可能会引起一些混淆。
我的问题是如何最好地处理此类问题。可以抑制第一个错误消息吗?或者改成不那么显眼的东西?
对于任何疑惑,我最终使用以下(相当明显的)解决方案来提醒自己调试时。
import logging
logger = logging.getLogger(__name__)
some_dict = {} # oops a bug, this should have 'expected key'
try:
some_dict['optional key'] # expected error
except KeyError as err:
logger.info('Expected Error: %s', err)
some_dict['expected key'] # unexpected error