从内部代码捕获抛出的库错误的最 Pythonic 方法是什么

我的代码如下所示:


# foo.py

from internallib.a import A


A.some(new_schema)

# a.py

from internallib.b import B


class A:

   @staticmethod

   def some(schema_name):

      B.thing(schema_name, other_parameter)

# b.py

import marshmallow


class B:

   @staticmethod

   def thing(schema_name, other_parameter):

      marshmallow.class_registry.get_class(schema_name)

Marshmallow 抛出一个错误,我想为用户捕获并打印该错误,然后退出(而不是仅打印堆栈跟踪)。这里的具体细节是,当调用 get_class 并且架构尚未注册时,Marshmallow 会引发RegistryError。


但是,这是完全预期的情况 - 可以尝试添加架构,并且我想向用户显示该错误 - 将其视为“找不到文件”错误。堆栈跟踪感觉级别太低,无法呈现。


但是,A.some()在代码中的许多地方都会调用它。执行此操作的 pythonic 方法是什么?我的想法:


将 marshmallow() 包装在 try-except 中,打印出一些内容,然后 exit()

去我打电话的任何地方A.some(new_schema)并包装它(这不是我的偏好,但如果有必要的话)

还有别的事吗?


精慕HU
浏览 87回答 1
1回答

慕神8447489

解决方案选项 1 - 所有A.some()调用者的统一行为:将调用B.thing()包装在捕获非常特定的异常A.some()中,同时使用记录器在退出之前try except在块中记录错误。except选项 2 - 调用者所需的不同行为A.some():如果您希望根据调用 A.some() 的上下文来改变行为,那么您需要重构以捕获选项 1 中的相同错误并引发您自己的内部错误,名为FileNotFound,每个调用者都A.some()能够单独处理行为。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python