在Python中,“引发错误”和“记录错误”之间,哪种做法更好?

2024-03-29 04:42:31 发布

您现在位置:Python中文网/ 问答频道 /正文

Python教程有一个叫做Errors和Exceptions的部分,它使用结构作为

try:
    [statement]
except [Built-in ExceptionType]:
    do something when an exception has been captured.
finally:
    do something whether exception occurred or not.

这也可以通过直接引发错误来处理。你知道吗

try:
    raise [Built-in ExceptionType]
except [Built-in ExceptionType above] as e:
    print(f'foo error: {e}')

有几个内置的异常类型,好的做法是开发人员应该捕获开发人员应该查找的每个特定异常类型。(参考Why is "except: pass" a bad programming practice?

不过,在我阅读了日志部分之后。我想把错误记录到日志文件中,让用户知道错误(也许只是打印文本,用户可以通知IT支持),而不是在屏幕上抛出异常。因此,不用上面的try/except组合,我可以使用下面的错误消息并记录它。你知道吗

if len(symbol) != 1:
    error_message = f'Created box with symbol={symbol}, width={width} and height={height}, Symbol needs to be a string of length 1'
    logger.error(error_message)
    print(f'\nError! symbol={symbol}, width={width} and height={height} -- Symbol needs to be a string of length 1')
    return

我怀疑目前更好的做法是:

a)在屏幕上引发错误并

b)记录错误以便进一步调查?你知道吗

c)其他方法(请建议我)

我希望我不要试图比较两个不同的事情。为了我,我想选择b)并将错误存储在日志中。这样便于调查,不会给用户提供不必要的信息。但我不确定我是否在正确的轨道上。非常感谢你。你知道吗


Tags: 用户in错误记录exceptionerrorsymbolwidth
3条回答

正如deceze已经提到的,日志和异常是两个完全不同的东西。一般来说:

  • 当遇到在代码的这一点上无法处理的意外/无效条件时,将引发异常。这个异常会发生什么(调用堆栈中是否有人会处理它)现在与您无关

  • 只有当您能够处理异常或希望记录异常(最终包含额外的上下文信息)时,才能捕获异常,然后重新释放它

  • 在应用程序的顶层,您最终会添加一个catchall异常处理程序,该处理程序可以记录异常并根据应用程序的类型(命令行脚本、GUI应用程序、web服务器等)决定处理这种情况的最佳方式。

日志主要是用于事后检查、程序行为分析等的开发人员/管理工具,它既不是错误处理工具,也不是最终用户界面特性。你的例子:

if len(symbol) != 1:
    error_message = f'Created box with symbol={symbol}, width={width} and height={height}, Symbol needs to be a string of length 1'
    logger.error(error_message)
    print(f'\nError! symbol={symbol}, width={width} and height={height} -- Symbol needs to be a string of length 1')
    return

是一个完美的反模式。如果函数需要一个字符串,而调用方传递了其他任何内容,那么唯一合理的解决方案是引发异常并让调用方处理它。它是怎样的,再一次,不关你的事。你知道吗

出于两个不同的目的,日志记录和引发异常是两件不同的事情。日志允许您检查程序事后所做的操作。引发异常对当前的程序流有重要影响。有时你想要一个,有时你想要另一个,有时你两者都想要。你知道吗

问题始终是错误是预期的还是意外的,是否有计划在发生错误时做些什么,以及通知任何人错误的发生是否有用。你知道吗

应该捕获并处理您有“备份计划”的预期错误,这是常规的程序控制流。意外错误可能会使程序停止,或者至少使发生错误的特定函数停止。如果上级调用方想处理异常,就让他们来处理。是否记录一个错误(除了处理或不处理它之外)取决于是否有人能从这个日志条目中收集到有用的信息,或者它是否只是噪音。你知道吗

你应该记录所有的错误,不管这些错误是为了日志分析和重构而抛出或处理的。你知道吗

是否抛出或处理错误通常取决于代码的预期目的和错误的严重性。你知道吗

Although "throwing" should be only used in debugging and handled 'gracefully' by dedicated exception code in the production version of the application. No user likes crashes.

  • 如果错误影响业务逻辑、代码的最终结果,或可能对软件用户造成损害,则要终止执行。您可以通过抛出错误或通过关闭程序的专用错误处理过程来处理它。你知道吗
  • 如果错误不严重,并且不影响程序的正常功能,则可以根据团队中的最佳实践和项目的要求选择是处理错误还是抛出错误。你知道吗

相关问题 更多 >