我目前正在尝试编写代码来捕获异常,并且根据引发的异常,将导入与未引发异常时不同的模块。
try:
import sge_execution_engine as execution_engine
except ImportError:
print "Use local execution engine because SGE support is missing!"
print sys.exc_info() # Print out the exception message
import local_execution_engine as execution_engine
except RuntimeError:
print "Using local execution engine because SGE support is missing!"
print sys.exc_info()
import local_execution_engine as execution_engine
第一个异常,ImportError
即被捕获,捕获drmaa
在执行过程中找不到python模块时抛出的异常import sge_execution_engine
(里面sge_execution_engine
有一条import drmaa
语句)。第二个异常, ,在找到 python 库RuntimeError
时被捕获(就像在执行中的语句期间一样),但C 库没有安装到操作系统中。我们希望这两个语句足以捕获当用户尝试在没有 python库、C 库或未安装 Sun Grid Engine 的机器上运行此模块时可能引发的所有可能的异常。没有任何这些收益,模块将继续drmaa
import drmaa
sge_execution_engine
drmaa
except
drmaa
drmaa
import local_execution_engine
这样代码就可以在本地用户的机器上执行。现在,代码按预期工作,因为它在使用 sge 发现异常时会导入本地,但我们仍在寻求改进此处的异常处理以使其更加健壮。
在我看来,我认为将抛出的实际异常消息打印到标准输出是很好的,因为它可以让用户知道为什么他无法导入 sge_execution_engine 尤其是如果他不希望导入失败。
然而,我意识到,也许更好的方法是使用格式,然后打印出来,并调用与抛出和分配的异常相关的一些属性,而不是使用print sys.exc_info()
实际在屏幕上打印异常消息到.except EXCEPTION as some_variable_name
print some_variable_name
some_variable_name
我在Python 教程中看到这是在有这段代码的异常中完成的:
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as e:
print "I/O error({0}): {1}".format(e.errno, e.strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
似乎该块通过专门调用对象的and属性以except IOError as e
细粒度的方式处理异常消息。但是,当我查看文档时,我没有看到这些特定属性被列为异常文档的一部分。事实上,Python 文档中的所有其他异常也是如此,因此我们似乎无法确定哪些属性将与特定异常相关联。如果我们对此一无所知,那么当我们使用语法来处理我们的异常时,我们如何能够弄清楚要在对象上调用哪些属性呢?errno
strerror
IOError
IOError
some_variable_name
import EXCEPTION as some_variable_name
我将不胜感激任何人对此的建议,即使您的回答没有直接回答我的问题,但是如果您对如何更好地处理我的异常有另一个完全不同的建议,请不要犹豫,发帖!
非常感谢!