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

时间:2009-06-30 11:45:33

标签: python django exception

更新:据我所知,这不是Python相关的主要问题,但似乎更具体。有关我的问题的更多解释,请参阅下文。

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

import application.exceptions

import some.application.exceptions

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

现在展示我的问题:假设函数do_something来自另一个以我不知道的方式导入exceptions.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我通过import application.exceptions导入exceptions.py,这似乎有效。 (现在,在回顾展中,我不确切地知道,为什么它有效......)

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

更新2

有些读者可能会感兴趣,我终于找到了进口出错的地方。

sys.path没有显示任何可疑的违规行为。我的Django项目位于/var/www/django/project。我安装了应用app1app2,但在settings.py中注明了

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

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

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

解决了这个问题。

4 个答案:

答案 0 :(得分:1)

为什么会出现问题?我将根据类类型进行匹配,但它会相同,但它会导入,例如。

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

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

都捕获相同的异常

您甚至可以将其分配给新名称,但通常不建议

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

答案 1 :(得分:1)

“如果没有,那么避免这些名称冲突的最佳做法是什么?”

这完全取决于他们为什么会这样。在正常安装中,您无法从application.exceptions和somepath.application.exceptions导入,除非第一种情况是模块somepath中的相对路径。在这种情况下,Python会理解模块是相同的,你也不会有问题。

你不清楚你是否真的有问题或是否有理论。如果你确实遇到了问题,我猜你的PYTHONPATH有些可疑。也许目录和它的子目录都在PATH中?

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我不知道是否有办法处理这个包含路径问题。 我的建议是在导入中使用'as'关键字

类似的东西:

import some.application.exceptions as my_exceptions

import application.exceptions as my_exceptions