2014-12-12 16 views
6

On thi mã dưới đây tôi nhận được dưới đây lỗi nếu nó không thành công để có được firefox hồ sơ/webdriver vì một lý do:trường hợp ngoại lệ phải được các lớp học kiểu cũ hoặc có nguồn gốc từ BaseException, không NoneType

trường hợp ngoại lệ phải kiểu cũ lớp học hoặc có nguồn gốc từ BaseException, không NoneType

tôi muốn hiểu tại sao lỗi này sẽ được hiển thị trong trường hợp này:

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 

Trả lời

5

Điều này là do bạn đang sử dụng raise mà không cung cấp loại hoặc trường hợp ngoại lệ.

Theo documentation:

Đối số duy nhất để nâng cao chỉ ra ngoại lệ được nâng lên. Điều này phải là một trường hợp ngoại lệ hoặc một lớp ngoại lệ (một lớp học xuất phát từ Ngoại lệ).

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 

Lưu ý rằng raise không có đối số có thể được sử dụng bên trong một khối except lại tăng một ngoại lệ.


FYI, trên python3, nó sẽ nâng cao một RuntimeError thay vì:

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

Lưu ý rằng raise mà không cần một cuộc tranh cãi được phép nếu bạn đang ở trong một khối với một ngoại lệ catch hiện xử lý:

Nếu bạn cần xác định xem có ngoại lệ được nêu ra hay không nhưng không có ý định xử lý nó, một biểu mẫu đơn giản hơn của tuyên bố tăng lương cho phép bạn tái nâng cao ngoại lệ: (. Từ Raising Exceptions trong tài liệu)

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

Hãy coi chừng, mặc dù, rằng nếu một phương pháp gọi là trong khối expect xóa ngoại lệ thông tin, raise không có đối số sẽ dẫn đến ngoại lệ exceptions must be…. Vì vậy, chỉ định rõ ràng ngoại lệ cho biến có except … as an toàn hơn:

try: 
    raise NameError('HiThere') 
except NameError as e: 
    log_and_clear_exception_info('An exception flew by!') 
    raise e 
Các vấn đề liên quan