2012-10-24 31 views
15

Đây là mã đơn giản:Cách thích hợp để tăng ngoại lệ trong python?

import sys 

class EmptyArgs(StandardError): 
    pass 

if __name__ == "__main__": 
    #first way to raise exception 
    if len(sys.argv) == 1: 
     raise EmptyArgs  
    #second way to raise exception 
    if len(sys.argv) == 1: 
     raise EmptyArgs() 

Cách nào "chính xác hơn"? Cả hai đều đang làm việc.
Lưu ý: Trong mã thực sự của tôi, ngoại lệ chính xác giống như tôi đã khai báo: không có thông báo và đối số.

Trả lời

23

Cả hai đều phù hợp; các hình thức sau cho phép của bạn đính kèm đối số ngoại lệ của bạn:

if len(sys.argv) == 1: 
    raise EmptyArgs('Specify at least 1 argument') 

Bạn cũng có thể vượt qua trong các đối số là một giá trị thứ hai như một tuple trong báo cáo tăng:

if len(sys.argv) == 1: 
    raise EmptyArgs, ('Specify at least 1 argument',) 

nhưng một tổ chức phi-tuple đơn giá trị sẽ làm việc quá, và được coi là một cuộc tranh luận duy nhất:

if len(sys.argv) == 1: 
    raise EmptyArgs, 'Specify at least 1 argument' 

và một giá trị thứ ba để raise bạn hãy chỉ định một traceback thay thế, mà sau đó được sử dụng thay cho một traceback đó sẽ được tạo ra cho các vị trí hiện tại trong các mã:

if len(sys.argv) == 1: 
    raise EmptyArgs, ('Specify at least 1 argument',), traceback_object 

Xem tài liệu cho các raise statement

Lưu ý rằng khi bạn sử dụng lập luận cho ngoại lệ của bạn, The Python styleguide PEP 8 thích bạn cung cấp một ví dụ ngoại lệ, và không phải là một lớp học:

Khi tăng ngoại lệ, hãy sử dụng raise ValueError('message') thay vì biểu mẫu cũ hơn raise ValueError, 'message'.

Biểu mẫu sử dụng song song được ưu tiên vì khi đối số ngoại lệ dài hoặc bao gồm định dạng chuỗi, bạn không cần phải sử dụng ký tự tiếp tục dòng nhờ dấu ngoặc đơn có chứa. Biểu mẫu cũ hơn sẽ bị xóa bằng Python 3.

Python 3 sẽ không hỗ trợ biểu mẫu đó nữa.

+3

Tôi sẽ thêm điều đó vào Python 3.0, hỗ trợ cho việc tạo các bộ dữ liệu như 'nâng cao EmptyArgs," văn bản "' [đã bị xóa] (http://www.python.org/dev/peps/pep-3109 /). –

+0

nâng cấp lớp ngoại lệ không phải là cách để đi –

+1

@AnuragUniyal: Python 3 hỗ trợ biểu mẫu đó tốt, không có vấn đề gì với biểu mẫu đó. Nó không còn hỗ trợ 'nâng cao class, value, tb' form. –

0

Hai biểu mẫu tương đương; cả hai đều kết thúc việc ném một bản sao của EmptyArgs. Từ the documentation:

Nếu đối tượng đầu tiên là một lớp, nó sẽ trở thành loại ngoại lệ. Đối tượng thứ hai được sử dụng để xác định giá trị ngoại lệ: Nếu nó là một cá thể của lớp, cá thể trở thành giá trị ngoại lệ. Nếu đối tượng thứ hai là một tuple, nó được sử dụng làm danh sách đối số cho hàm tạo lớp; nếu nó là None, một danh sách đối số rỗng được sử dụng và bất kỳ đối tượng nào khác được coi là một đối số duy nhất cho hàm tạo. Ví dụ được tạo bằng cách gọi hàm tạo được sử dụng làm giá trị ngoại lệ.

Các "đối tượng thứ hai" nói trên là (không bắt buộc) đối số thứ hai để raise:

raise EmptyArgs, 'Invalid input!' 
3

Đó là KHÔNG khuyến khích để nâng cao ngoại lệ không có đối số tức là nâng cao lớp ngoại lệ không phải là con đường để đi.Chỉ cần làm một cái gì đó như thế này

raise MyException() 

vì bằng Python 3,0 trường hợp tương tự đã bị xóa do tốt

raise Exception, "foo" 

Nên có cùng-- và tốt nhất là chỉ có một cách --obvious để làm điều đó.

+1

Trong trường hợp của mình, nó không có sự khác biệt, [PEP 3109] (http://www.python.org/dev/peps/pep-3109/) nói: _EXCEPTION có thể là một lớp ngoại lệ hoặc một cá thể của một lớp ngoại lệ. Vấn đề xảy ra khi bạn đang sử dụng tuples, như trong ví dụ thứ hai của bạn. Điều này không còn giá trị. –

+1

@PaoloMoretti đồng ý, nhưng tôi vẫn không khuyên bạn nên sử dụng nó, như tôi không đề xuất các tab và tôi hy vọng nó sẽ bị xóa khỏi python 3.x –

+0

Bạn muốn xóa các tab? : o (Kidding, tôi thực sự đồng ý với các đối tượng trên tuyên bố loại, không phải với các tab mặc dù) – poke

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