2011-11-28 38 views
17

Lớp ngoại lệ "thích hợp" để tăng khi một trong các hàm của tôi phát hiện None được thông qua khi giá trị đối số là bắt buộc? Ví dụ:Ngoại lệ thích hợp để tăng nếu Không gặp phải là đối số

def MyFunction(MyArg1, MyArg2): 

    if not MyArg2: 
      raise ?Error? 

Tôi nghĩ rằng tôi đã nhìn thấy TypeError sử dụng ở đây (và đó là sự thật mà tôi đang nhận một NoneType nơi một số loại khác được dự kiến) nhưng điều đó không tấn công tôi như khá phù hợp với tình hình này nơi tôi nghĩ Ngoại lệ có thể rõ ràng hơn.

+0

Bạn không nên làm kiểu kiểm tra đối số này. Đơn giản chỉ cần để cho nó thất bại hơn nữa với bất cứ điều gì ngoại lệ nó không thành công với. (Và nếu bạn thực sự * phải * làm điều này, 'TypeError' là ngoại lệ chính xác. Thêm một chuỗi giải thích để làm cho nó cụ thể hơn.) –

+0

Tôi có lẽ sẽ nâng một' TypeError', có một cái nhìn tại các trường hợp ngoại lệ trăn cài sẵn tài liệu hướng dẫn: http://docs.python.org/library/exceptions.html –

+0

@Sven: Tôi thường làm như bạn đề xuất, nhưng đây là trường hợp đặc biệt mà tôi muốn thực hiện việc kiểm tra này. –

Trả lời

29

Không có ngoại lệ tích hợp "đối số không hợp lệ" hoặc "con trỏ rỗng" trong Python. Thay vào đó, hầu hết các chức năng nâng cao TypeError (loại không hợp lệ như NoneType) hoặc ValueError (loại chính xác, nhưng giá trị nằm ngoài miền được chấp nhận).

Nếu chức năng của bạn yêu cầu đối tượng của một lớp cụ thể và nhận được None thay vào đó, nó có thể tăng TypeError như bạn đã chỉ ra. Trong trường hợp này, bạn nên kiểm tra cho None một cách rõ ràng, tuy nhiên, kể từ khi một đối tượng kiểu đúng có thể đánh giá để boolean False nếu nó thực hiện __nonzero__/__bool__:

if MyArg2 is None: 
    raise TypeError 

Python docs:

-1

Chỉ cần sử dụng khẳng định:

assert type(MyArg2) == int 

Hoặc cách khác:

assert type(MyArg2) != None 

Điều này sẽ tránh người khác đi bạn gõ sai, cũng như đối phó với các vấn đề None. Nó sẽ trả lại một AssertionError, as per the docs.

+1

Điều này hoàn toàn trái ngược với tinh thần gõ của Python. Nó áp đặt các hạn chế không cần thiết về khả năng áp dụng của mã. (Không phải của tôi downvote, btw) –

+1

@SvenMarnach Hmm, tôi đã sử dụng nó thành công * vì * gõ vịt.Cụ thể, việc gõ vịt đã ẩn * tại sao * một cái gì đó không thành công. Nếu bạn thấy mình cần phải nói điều này và phải như vậy trước khi chúng tôi bắt đầu, thì hãy khẳng định chỉ là một cách thuận tiện để làm như vậy. Ví dụ, viết một hàm với vòng lặp for trên một biến đầu vào. Nó được giả định là một danh sách các tên tập tin cho globbing. Điều gì sẽ xảy ra nếu thay vì chuyển danh sách với một mục, bạn chuyển một chuỗi với các ký tự toàn cục? –

+1

Vấn đề với khẳng định là nó bỏ qua các giá trị có thể phục vụ hoàn hảo như (trong ví dụ này) số nguyên, bao gồm số nguyên dài, nổi (trong nhiều trường hợp, ví dụ 'range()'), và bất kỳ đối tượng nào thực hiện '__int__() 'phương pháp đặc biệt. Một cách tiếp cận tốt hơn, nếu bạn cảm thấy bạn cần loại điều này, có thể chỉ đơn giản là cố gắng ép buộc đối số vào số nguyên sớm trong phương pháp, ví dụ: 'MyArg2 = int (MyArg2)'. – kindall

2

Hầu hết hàm python tăng TypeError nếu None được chuyển làm đối số. Thực hiện bất kỳ chức năng nào nói chr(None) và xem nó tăng TypeError.

2

Như những người khác đã lưu ý, TypeError hoặc ValueError sẽ là tự nhiên. Nếu nó không có vẻ đủ cụ thể, bạn có thể phân lớp cho dù hai ngoại lệ nào là phù hợp hơn. Điều này cho phép xử lý nhất quán các đối số không hợp lệ cho một lớp rộng các hàm trong khi cũng cung cấp cho bạn nhiều chi tiết hơn cho hàm cụ thể.

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