我希望通过在导入中包含异常处理来缩小常见错误"attempted relative import beyond top-level package"
的范围。
在DjangoProject/tests.py
中的Django测试中,我编写了相对于自身的导入(tests.py
)。执行每个测试文件的默认unittests.py
位于根文件夹中,其中还包括DjangoProject-文件夹。
当我得到错误attempted relative import beyond top-level package
的时候,我把DjangoProject/tests.py
添加到了我的单元测试中,很明显,它来自进口。尝试/除了我能够写一个稍微更清楚的错误,所以我不需要猜测为什么和哪个文件导致错误。
现在我的代码如下所示:
try:
from django.utils.safestring import mark_safe
import json
from django.conf import settings
from viewsfunctions import *
from .. import PoM
import unittest
except Exception as importex:
print("Error in the tests.py-imports: "+str(importex))
它首先传达了这样的信息:
"No module named 'viewsfunctions'"
这很有意义,而且很有帮助,因为viewsfunctions
是DjangoProject
中的一个模块。我将行替换为:from DjangoProject.viewsfunctions import *
下一个错误是:
Error in the Imports: attempted relative import beyond top-level package
这正是我的问题。这可能是任何东西。只需简单地查看一下,我就可以追踪到from .. import PoM
(因为模块PoM
相对于顶部文件夹中的tests.py
,但相对于同一文件夹中的执行unittests.py
)。
在这种情况下,只需要几个导入,就可以比较快地缩小它的范围,但是是否有任何方法可以编写更好的异常消息或以某种方式传递更多的信息,在哪些导入行中实际发生了错误?
发布于 2019-12-11 10:26:58
如果您不能捕捉到异常,您将得到一个非常有用的跟踪:
>>> from .. import foo
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Users/deceze/...", line 21, in do_import
module = self._system_import(name, *args, **kwargs)
ImportError: attempted relative import with no known parent package
问题是,您正在捕获异常,并且只打印尽可能最小的错误消息。如果您确实出于某种原因希望捕获异常,但仍然得到完整的错误消息,最简单的方法是使用logging
module。
import logging
try:
...
except:
logging.exception('Error fooing the bar')
这将产生您的自定义错误消息,然后是一个完整的堆栈跟踪。
要获得更多的手册,请使用traceback
module
import traceback
try:
...
except:
print('Error fooing the bar')
traceback.print_exc()
使用traceback
中的其他函数,您可以获得更多的粒度,并根据需要从异常打印或检索消息。
https://stackoverflow.com/questions/59283397
复制相似问题