2013-08-17 54 views
7

Không cố gắng để so sánh các ngôn ngữ nhưng chỉ dành riêng cho kiến ​​thức,Python: Java ném tương đương trong python

Có cách nào để có tương đương với java throws từ khóa/chức năng trong Python?

hoặc cách chúng tôi có thể nhận ra ngoại lệ đã kiểm tra được ném bởi bất kỳ phương pháp nào vào thời gian tĩnh?

hoặc Gửi (chaining) trách nhiệm xử lý ngoại lệ?

Java:

public void someMethod() throws SomeException 
{ 

} 

Python:

@someDecorator # any way to do? 
def someMethod(): 
    pass 

Trả lời

9

Nếu bạn không thể có đối số được nhập tĩnh, bạn không thể có khai báo ném tĩnh. Ví dụ, không có cách nào cho tôi để chú thích chức năng này:

def throw_me(x): 
    raise x 

Hoặc thậm chí này:

def call_func(f): 
    f() # f could throw any exception 

Những gì bạn có thể làm là làm cho nó một lỗi để ném bất kỳ loại ngoại lệ khác so với những người quy định:

from functools import wraps 

class InvalidRaiseException(Exception): 
    pass 

def only_throws(E): 
    def decorator(f): 
     @wraps(f) 
     def wrapped(*args, **kwargs): 
      try: 
       return f(*args, **kwargs) 
      except E: 
       raise 
      except InvalidRaiseException: 
       raise 
      except Exception as e: 
       raise InvalidRaiseException("got %s, expected %s, from %s" % (
        e.__class__.__name__, E.__name__, f.__name__) 
       ) 

     return wrapped 
    return decorator 
@only_throws(ValueError) 
def func(x): 
    if x == 1: 
     raise ValueError 
    elif x == 2: 
     raise Exception 
>>> func(0) 
>>> func(1) 
ValueError 
>>> func(2) 
InvalidRaiseException: got Exception, expected ValueError, from func 
+1

Tôi tìm thấy http://code.activestate.com/recipes/498131-checked-exceptions/ là điều gì đó tương đương –

8

Không có tương đương với tiêu chuẩn về điều này trong Python như xa như tôi biết, và nó không cần thiết nữa. Điều tốt nhất bạn có thể làm là chỉ ra trong docstring những ngoại lệ/lỗi được nêu ra trong hoàn cảnh nào, và để nó cho bất kỳ ai đang sử dụng các hàm của bạn để tính phần còn lại.

Trong Java, mệnh đề ném là một loại sổ kế toán. Ví dụ,

try { 
    foo(); 
} catch (IOException ioe) { 

} 

không biên dịch trừ foo được biết là có khả năng ném một IOException. Tương tự trong Python:

try: 
    foo() 
except IOError as ioe: 
    pass 

biên dịch bất kể. Không có khái niệm về "kiểm tra và bỏ chọn".

Các vấn đề liên quan