2014-12-12 2 views
6

On esecuzione sotto il codice ottengo sotto l'errore se non riesce a ottenere firefox profilo/WebDriver per qualche motivo:eccezioni devono essere classi vecchio stile o derivati ​​da BaseException, non NoneType

eccezioni devono essere vecchio stile classi o derivato da BaseException, non NoneType

voglio capire il motivo per cui questo errore viene visualizzato in questo caso:

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 

risposta

5

questo perché si sta utilizzando raise senza fornire un tipo di eccezione o un'istanza.

Secondo il documentation:

L'unico argomento per sollevare indica l'eccezione da sollevare. Questo deve essere un'istanza di eccezione o una classe di eccezione (una classe derivante da Eccezione).

Dimostrazione:

>>> 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 

noti che raise senza argomenti può essere utilizzato all'interno di un blocco except di ri-generare un'eccezione.


Cordiali saluti, il python3, sarebbe alzare una RuntimeError invece:

>>> raise 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
RuntimeError: No active exception to reraise 
4

noti che raise senza un argomento è consentito se si è in un blocco catch con un'eccezione attualmente gestita:

Se è necessario determinare se è stata sollevata un'eccezione ma non si intende gestirla, una forma più semplice della istruzione raise permette di ri-sollevare l'eccezione: (. Dal Raising Exceptions nella documentazione)

>>> 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 

Attenzione, però, che se un metodo chiamato nel blocco expect cancella l'eccezione info, raise senza un argomento risulterà nuovamente nell'eccezione exceptions must be…. Assegnare in modo esplicito l'eccezione a una variabile con except … as è più sicuro:

try: 
    raise NameError('HiThere') 
except NameError as e: 
    log_and_clear_exception_info('An exception flew by!') 
    raise e