paf*_*fcu 5 python exception-handling
如果用户试图运行试图导入尚未安装的模块的python脚本,我想实现一些更友好的错误消息.这包括打印有关如何安装缺失模块的说明.
一种方法是在输入周围放一个try..catch块,但这有点难看,因为它会变得简单像
import some_module
Run Code Online (Sandbox Code Playgroud)
成
try:
import some_module
except ImportError, e:
handle_error(e)
Run Code Online (Sandbox Code Playgroud)
它必须添加到每个文件中.另外,ImportError似乎没有将丢失模块的名称存储在任何地方(消息中除外),因此如果您需要知道名称(如我所知),则必须在每次导入时放置一个单独的try..catch .解析模块的名称不是选项,因为ImportError携带的消息可能会因python版本更改为版本而取决于用户的语言环境.
我想我可以使用sys.excepthook来捕获所有异常并传递除了ImportError之外的那些异常.或者可以定义类似的东西
safe_import some_module
Run Code Online (Sandbox Code Playgroud)
那会表现得像我想要的那样?
有谁知道这个问题的任何现有解决方案?
您可以放置,它将始终执行(例如在site.py或sitecustomize.py中):
import __builtin__
realimport = __builtin__.__import__
def myimport(modname, *a):
try:
return realimport(modname, *a)
except ImportError, e:
print "Oops, couldn't import %s (%s)" % (modname, e)
print "Here: add nice directions and whatever else"
raise
__builtin__.__import__ = myimport
Run Code Online (Sandbox Code Playgroud)
请参阅此处的__import__文档.
我会将其他模块放入包中,导入时打印出更有用的消息,然后引发常规的 ImportError。当安装了真正的模块时,您的模块将被隐藏(确保您将它们所在的目录添加到sys.path 的末尾)。