使用自定义异常而无需导入它们

时间:2018-08-29 20:20:43

标签: python python-3.x exception-handling

我为我的一个项目定义了一些自定义例外。人们可以使用标准Python异常(例如ZeroDivisionError)而无需进行任何import的方式,是否可以通过任何方式设置我的项目以使自定义异常暴露给其中一个文件中的所有文件包?

1 个答案:

答案 0 :(得分:2)

Python将所有内置的异常类型放入builtins模块中。因此,无论您在哪里评估ZeroDivisionError,都可以找到它。 1

您的异常不在builtins中,它们不在您定义它们的模块中。因此,必须将它们作为mymodule.MyError进行访问,或将其与from mymodule import MyError一起导入

此外,正如N. Chauhan在a comment中指出的那样,您很少需要少数几个公共异常类型,通常只有一个。您可能有30种不同的内部错误类型,它们在内部方面很重要,但是您的用户可能只关心1或2种不同类型的错误,因此您可以使30种错误类型都是1或2个基类的所有子类,并且您的用户只需import个。


您能做同样的把戏吗?是的,实际上很容易 2 ,但这几乎总是一个坏主意。

听起来像这样对于REPL上的交互式编程很方便,但是在那儿并不需要它。只需将新内容添加到当前(__main__)模块中,就可以像访问builtins中一样方便了,对吗? Python为此提供了语法糖。实际上,这正是from mymodule import MyError的作用:它将MyError添加到当前模块的全局变量中。

对于非交互式编程,将内容放入内置组件会使您的代码混乱且难以阅读。

如果我在某些代码中看到MyError,而在顶部看到from mymodule import MyError,则很明显它是从哪里来的。如果没有,那么除非穷举搜索整个代码库和导入到任何地方的所有站点包模块,否则就无法找出MyError的来源。

对于IDE和其他可帮助您编写和导航代码的工具而言,这甚至变得更加困难。如果我将鼠标悬停在PyCharm中的MyError上方,并且顶部有一个from mymodule import MyError,PyCharm会立即知道它的来源,并且可以在任何有用的信息上显示一个很好的工具提示。我可以右键单击它,然后可以跳到MyError的定义。如果启用了静态类型检查,它将知道MyError是什么,并且可以验证它是Exception的子类。等等。但是如果没有该import,PyCharm就不可能知道MyError的含义。


1。在评估ZeroDivisionError时,其工作方式的过于简化的版本是:如果它不是局部变量或自由变量,Python将在全局变量中查找它,如果不在全局变量中,则在内置函数中查找它。 (有关详细说明,请参见eval and exec文档,有关详细信息,请参见Resolution of names。)

2。你怎么做呢?您可以 将另一个builtins模块替换为恰好包含您多余内容的全局变量,但是真正简单的方法是仅import builtins并向其中添加新内容,例如builtins.MyError = MyError