具有不同include路径的自定义Python异常

2024-04-25 11:31:17 发布

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

更新:正如我所说,这不是与Python相关的原则性问题,但似乎更为具体。请看下面对我的问题的更多解释。在

我有一个自定义异常(我们称之为CustomException),它位于一个名为exceptions.py的文件中。现在想象一下,我可以通过两个路径导入该文件:

import application.exceptions

或者

^{pr2}$

同样的结果。此外,我无法控制在其他模块中导入模块的方式。在

现在展示我的问题:假设函数do_something来自另一个导入的模块异常.py在某种程度上我不知道。如果我这样做:

import application.exceptions
try:
  do_something ()
except application.exceptions.CustomException:
  catch_me ()

可能起作用或不起作用,这取决于子模块如何导入exceptions.py(我不知道)。在

问题:是否有一种方法可以避免这个问题,也就是说,不管包含路径如何,异常的名称都会被理解?如果没有,那么什么是避免这些名称冲突的最佳实践?在

干杯

更新

这是一个Django应用程序。some将是Django“项目”的名称,application一个Django应用程序的名称。带有try..except子句的代码位于另一个应用程序frontend,并作为文件some/frontend/views.py中的视图存在于那里。在

PYTHONPATH是干净的,也就是说,在我的项目中,/path/to/project在路径中。在frontend/views.py中,我导入异常.py通过import application.exceptions,这似乎是有效的。(现在,回顾过去,我不清楚,为什么会起作用…)

异常在exceptions.py文件本身中引发。在

更新2

对一些读者来说,这可能是有趣的,我终于找到了进口出错的地方。在

sys.path没有显示任何可疑的异常情况。我的Django项目位于/var/www/django/project。我已经安装了app1app2,但是在设置.py作为

INSTALLED_APPS = [
  'project.app1',
  'project.app2',
]

额外的project.是搞乱sys.modules的罪魁祸首。正在将设置重写为

INSTALLED_APPS = [
  'app1',
  'app2',
]

解决了问题。在


Tags: 模块文件项目djangopyimport路径project
3条回答

即使同一个模块以不同的方式多次导入,CustomException类仍然是同一个对象,因此如何引用它并不重要。在

“如果没有,有什么最佳做法可以避免这些名称冲突?”在

这完全取决于它们发生的原因。在正常安装中,不能同时从这两者导入应用程序.例外以及somepath.application.exceptions,除非第一种情况是来自模块somepath的相对路径。在这种情况下,Python将理解模块是相同的,您不会有问题。在

你不清楚你是真的有问题还是理论问题。如果你真的有问题,我猜你的Python有点可疑。可能一个目录和它的子目录都在路径中?在

为什么会有问题?异常将根据类类型进行匹配,并且无论它是如何导入的,它都是相同的

import exceptions
l=[]
try:
    l[1]
except exceptions.IndexError,e:
    print e

try:
    l[1]
except IndexError,e:
    print e

两者都捕捉到相同的异常

你甚至可以给它指定一个新的名字,尽管通常不推荐

^{pr2}$

相关问题 更多 >