python - 不在 python 中的正确包中时不会捕获异常

标签 python exception package

编辑: 好的,我设法隔离了错误和准确、完整的代码来重现它。但它看起来要么是设计使然,要么是 python 中的错误。

创建两个同级包:adminGeneral,当然每个包都有自己的 __init__.py。 在包 admin 中,将文件“test.py”放入以下代码:

from General.test02 import run
import RunStoppedException
try:
    run()
except RunStoppedException.RunStoppedException,e:
    print 'right'
except Exception,e:
    print 'this is what i got: %s'%type(e)

同时在 admin 中将文件“RunStoppedException.py”放入以下代码:

class RunStoppedException(Exception):
    def __init__(self):
        Exception.__init__(self)

General 包中,将文件 test02.py 放入代码:

import admin.RunStoppedException
def run():
    raise admin.RunStoppedException.RunStoppedException()

打印输出:

this is what i got: <class 'admin.RunStoppedException.RunStoppedException'>

什么时候它应该是正确的。只有当一个文件与异常位于同一目录中时才会发生这种情况,因此它们以不同的方式导入它。

这是设计使然,还是 python 的错误?

我用的是python2.6,在eclipse+pydev下运行

最佳答案

import admin.RunStoppedException

这是一个不明确的相对导入。您是说 admin 顶级模块中的 RunStoppedException 吗?或者当你在包中时从 mypackage.admin ?如果您当前的工作目录(添加到模块搜索路径中)恰好在包内,它可能是其中之一,这取决于 Python 是否知道它在包内,这取决于您运行脚本的方式。

如果您在不同的模块中同时拥有 import admin.RunStoppedExceptionimport RunStoppedException,那么很可能会导入同一模块的两个副本:一个顶层RunStoppedExceptionadmin 包的子模块admin.RunStoppedException,导致异常的两个实例,随后在except 中不匹配

所以不要使用隐式相对导入。它们无论如何都会消失(参见 PEP328 )。始终拼出完整的模块名称,例如。 导入 mypackage.admin.RunStoppedException。但是,请避免为您的模块名称和您的类名称使用相同的标识符,因为这会非常困惑。请注意,Python 将允许您说:

except RunStoppedException:

该标识符指的是模块而不是 Exception 的子类。这是出于历史原因,也可能会消失,但同时它可以隐藏错误。一种常见的模式是使用 mypackage.exceptions 来保存许多异常。每个文件一个类是一种在 Python 中不受欢迎的 Java 习惯。

通常尽量减少模块内容(如类)的导入也是一个好主意。如果某些内容更改了模块内 RunStoppedException 的副本,您现在将在不同的脚本中拥有不同的副本。虽然类大部分不会更改,但模块级变量可能会更改,并且当您从其所有者模块中获取内容时,猴子修补和重新加载会变得更加困难。

关于python - 不在 python 中的正确包中时不会捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1988475/

相关文章:

python - FastAPI 应用程序在本地运行但不在 Docker 容器中

python - 将数据替换到不同的文件

node.js - 轻松找出兼容的依赖版本

python - 使用点分语法的子包中模块的包内引用

c++ - 为什么 GetLastError() 会根据调用方式返回 0 或 2?

python - 有没有支持对象消息传递的Python包?

python - Tensorflow ArgumentError 运行 CIFAR-10 示例

python - python中的链式调用父初始化器

java - 在 Spring Boot 中使用自定义异常处理时出现 .jpg 500 错误?

ios - 在没有突变的情况下得到 "NSOrderedSetArrayProxy was mutated while being enumerated"错误