2014-12-12 9 views
6

Na wykonanie poniżej kodu otrzymuję poniżej błędu, jeśli nie dostać firefox profil/webdriver z jakiegoś powodu:wyjątki muszą być zajęcia w starym stylu lub pochodzi z BaseException nie NoneType

wyjątki muszą być w starym stylu klas lub pochodzące z BaseException nie NoneType

chcę zrozumieć, dlaczego ten błąd jest wyświetlany w tym przypadku:

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 

Odpowiedz

5

to dlatego, używasz raise bez podawania typu wyjątku lub instancji.

Według documentation:

Jedynym argumentem, aby podnieść wskazuje wyjątku zostać podniesiony. Ta musi być instancją wyjątku lub klasą wyjątków (klasa pochodząca z wyjątku).

Demo:

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

Zauważ, że raise bez argumentów można stosować wewnątrz bloku except aby ponownie podnieść wyjątek.


FYI, na python3, byłoby podnieść RuntimeError zamiast:

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

Zauważ, że raise bez argumentu jest dozwolone, jeśli jesteś w catch bloku z wyjątkiem obecnie obsługiwane:

Jeśli konieczne jest ustalenie, czy wyjątek został zgłoszony, ale nie ma zamiaru się nim zajmować, prostszy formularz oświadczenia podbicie pozwala na ponowne podniesienie wyjątek: (. Od Raising Exceptions w dokumentacji)

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

Uważaj jednak, że jeśli metoda zwana w bloku expect czyści wyjątek info, raise bez argumentu spowoduje ponowne zgłoszenie wyjątku exceptions must be…. Tak więc jawne przypisanie wyjątku do zmiennej o numerze except … as jest bezpieczniejsze:

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