代码之家  ›  专栏  ›  技术社区  ›  noname7619

日志记录刚刚出现异常

  •  -1
  • noname7619  · 技术社区  · 9 年前

    这样做是惯用的还是有更好的方法?我希望所有的错误都记录在日志中,以防我无法访问控制台输出。此外,我希望在出现问题时中止此代码路径。

        try:
          with open(self._file_path, "wb") as out_f:
               out_f.write(...)
               ...
        except OSError as e:
            log("Saving %s failed: %s" % (self._file_path, str(e)))
            raise
    

    logging

    1 回复  |  直到 9 年前
        1
  •  1
  •   bruno desthuilliers    8 年前

    一个行之有效的方案是在应用程序代码的顶层有一个通用的except子句,以确保任何未经处理的错误都会被记录(当然会被重新引发),并且它还为您提供了一个在崩溃之前尝试进行一些清理的机会

    一旦你做到了这一点,如果你想在你的日志消息中捕获更多的上下文信息,那么在你的代码中添加特定的“日志并重新发布”异常处理程序是有意义的,就像你的代码片段示例一样。这意味着异常可能会被记录两次,但这很难解决问题。

    如果你 真正地 想要成为pythonic(或者如果您重视错误日志),请使用 stdlib's logging module 它是 logger.exception()

    日志模块的一些(其他)好处是能够将日志配置(应该由应用程序本身处理,并且可以是非常细粒度的)与日志调用(通常发生在库代码级别)解耦,与编写良好的lib(已经使用)兼容 登录中 因此,您只需配置日志记录器以从第三部分lib获取信息,这真的可以节省您的时间),并能够根据日志源、严重性和部署环境使用不同的日志机制(到stderr、到文件、到syslog、通过电子邮件警报等等,并且您不局限于单个处理程序)。

    关于重新引发相同的异常(如示例中所示)或重新引发自定义异常(MyLibException)而不是原始异常,您会怎么说?

    这确实是一种常见的模式,但请注意不要做得过火——您只想对实际预期的异常和您需要的异常执行此操作 真正地 OSError ,'IOError and - so never assume anything about what really caused the exception, either check it with a decently robust condition (for example the .错误号 field for

    这种模式的另一个可能问题是(至少在Python2中)您将丢失原始异常和回溯,因此最好在引发您自己的异常之前适当地记录它们。IIRC-Python3有一些机制可以以更简洁的方式处理这种情况,让您保留一些原始的异常信息。

    推荐文章