在执行下面的代码时,如果由于某种原因导致无法获取firefox profile / webdriver,则会出现以下错误:
异常必须是旧式类或派生自BaseException,而不是NoneType
我想了解为什么在这种情况下显示此错误:
self.error = 0
self.profile, profileErrStatus = self.GetFireFoxProfile(path)
if self.profile:
self.driver, driverErrStatus = self.GetFireFoxWebDriver(self.profile)
if self.driver:
else:
print('Failed to get Firefox Webdriver:%s'%(str(sys.exc_info()[0])))
raise
else:
print('Failed to get Firefox Profile:%s'%(str(sys.exc_info()[0])))
raise
答案 0 :(得分:5)
这是因为您使用raise
而未提供异常类型或实例。
raise的唯一参数表示要引发的异常。这个 必须是异常实例或异常类(类 源于异常)。
演示:
>>> raise
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType
>>> raise ValueError('Failed to get Firefox Webdriver')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Failed to get Firefox Webdriver
请注意,可以在raise
块内部使用不带参数的except
来重新引发异常。
仅供参考,在python3上,它会引发RuntimeError
而不是:
>>> raise
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: No active exception to reraise
答案 1 :(得分:4)
请注意,如果您所在的raise
区块中有一个当前处理的异常,则catch
不允许参数 :
如果您需要确定是否引发了异常但不打算处理异常,则可以使用更简单的raise语句形式重新引发异常:
>>> try:
... raise NameError('HiThere')
... except NameError:
... print 'An exception flew by!'
... raise
...
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: HiThere
(来自文档中的Raising Exceptions。)
请注意,如果expect
块中调用的方法清除了异常信息,则raise
不带参数将再次导致exceptions must be…
异常。因此,使用except … as
明确地将变量分配给变量更安全:
try:
raise NameError('HiThere')
except NameError as e:
log_and_clear_exception_info('An exception flew by!')
raise e