异常必须是旧式类或派生自BaseException,而不是NoneType

时间:2014-12-12 07:42:28

标签: python python-2.7 exception

在执行下面的代码时,如果由于某种原因导致无法获取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   

2 个答案:

答案 0 :(得分:5)

这是因为您使用raise而未提供异常类型或实例。

根据documentation

  

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