2010-11-04 51 views
15

Có một danh sách standard python exceptions mà chúng ta nên xem ra, nhưng tôi không nghĩ rằng đây là những cái chúng ta nên nâng cao bản thân, vì chúng hiếm khi áp dụng.Danh sách ngoại lệ python chuẩn cho các chương trình cần nâng cao ở đâu?

tôi tò mò nếu có tồn tại một danh sách trong thư viện python tiêu chuẩn, với ngoại lệ tương tự như .NET của ApplicationException, ArgumentNullException, ArgumentOutOfRangeException, InvalidOperationException - trường hợp ngoại lệ mà chúng ta có thể nâng cao chính mình?

Hoặc có cách nào khác biệt hơn, nhiều hơn để xử lý các trường hợp lỗi phổ biến, hơn là tăng các ngoại lệ tiêu chuẩn?

CHỈNH SỬA: Tôi không hỏi cách xử lý các ngoại lệ nhưng tôi có thể làm gì và nên tăng nơi cần thiết.

Trả lời

12

Nếu lỗi phù hợp với mô tả của một trong các lớp ngoại lệ python chuẩn, sau đó bằng mọi cách, hãy ném nó.

Những ứng dụng phổ biến để sử dụng là TypeErrorValueError, danh sách bạn đã liên kết với đã là danh sách chuẩn.

Nếu bạn muốn có ứng dụng cụ thể, sau đó phân lớp Ngoại lệ hoặc một trong các hậu duệ của nó là con đường để đi.

Để tham khảo những ví dụ bạn đưa ra từ NET ApplicationException là gần gũi nhất với RuntimeError ArgumentNullException lẽ sẽ là một AttributeError (thử và gọi phương thức mà bạn muốn, hãy python nâng cao ngoại lệ một cách gõ vịt la) AttributeOutOfRange chỉ là một là cụ thể hơn ValueError InvalidOperationException có thể là bất kỳ số ngoại lệ tương đương nào tương tự như mẫu lib chuẩn python.

Về cơ bản, chọn một phản ánh bất kỳ lỗi nào mà bạn đang tăng dựa trên các mô tả từ trang http://docs.python.org/library/exceptions.html.

+0

Có lẽ 'ValueError' sẽ đáp ứng hầu hết nhu cầu của tôi. Thx, tôi đã bỏ lỡ nó trong khi lướt qua danh sách! –

2

Cách Pythonic chỉ cho phép các ngoại lệ đi qua từ chính Python. Ví dụ, thay vì:

def foo(arg): 
    if arg is None: 
    raise SomeNoneException 
    bar = arg.param 

Chỉ cần làm:

def foo(arg): 
    bar = arg.param 

Nếu argNone hoặc không có thuộc tính param, bạn sẽ nhận được một ngoại lệ từ Python chính nó.

Trong Python glossary này được gọi là "EAFP":

dễ dàng hơn để xin tha thứ hơn cho phép. Kiểu mã hóa Python phổ biến giả định sự tồn tại của các khóa hoặc thuộc tính hợp lệ và bắt các trường hợp ngoại lệ nếu giả định chứng minh sai. Phong cách sạch sẽ và nhanh chóng này là được đặc trưng bởi sự hiện diện của nhiều số thử và ngoại trừ các câu lệnh. Kỹ thuật trái ngược với LBYL (Nhìn Trước khi bạn nhảy) phong cách chung cho nhiều ngôn ngữ khác như C.

Và nó hoạt động tốt song song với triết lý vịt gõ vốn có của Python.


Điều này không có nghĩa là bạn không nên tạo ngoại lệ cho riêng mình, tất nhiên, chỉ cần bạn không cần bọc các ngoại lệ Python đã tồn tại.

Đối với trường hợp ngoại lệ của riêng bạn, hãy tạo các lớp học xuất phát từ Exception và ném chúng khi phù hợp.

+0

Thuật ngữ này 'arg.param', nó chỉ kiểm tra nếu' arg' là một thể hiện của một đối tượng có trường 'param'? –

+0

@WooYek: thực sự, bạn mong đợi 'arg' là một đối tượng như vậy, vì vậy đừng kiểm tra nó một cách rõ ràng, chỉ cần truy cập' arg.param' và Python sẽ ném một lỗi nếu nó không có ở đó. –

13

Đầu tiên, Python đặt ra các ngoại lệ tiêu chuẩn cho bạn.

Nó tốt hơn để cầu xin tha thứ hơn là xin phép

Đơn giản chỉ cần cố gắng hoạt động và để cho Python nâng cao ngoại lệ. Không đặt tất cả mọi thứ với if would_not_work(): raise Exception. Không bao giờ có giá trị bằng văn bản. Python đã thực hiện điều này trong tất cả các trường hợp.

Nếu bạn nghĩ rằng bạn cần tăng ngoại lệ chuẩn, có thể bạn đang viết quá nhiều mã.

Bạn có thể phải tăng ValueError.

def someFunction(arg1): 
    if arg1 <= 0.0: 
     raise ValueError("Guess Again.") 

Đôi khi, bạn có thể cần phải tăng TypeError, nhưng hiếm khi xảy ra.

def someFunctionWithConstraints(arg1): 
    if isinstance(arg1,float): 
     raise TypeError("Can't work with float and can't convert to int, either") 
    etc. 

Thứ hai, bạn hầu như luôn muốn tạo ngoại lệ riêng của mình.

class MyException(Exception): 
    pass 

Đó là tất cả những gì cần thiết để tạo ra điều gì đó đặc biệt và độc đáo cho ứng dụng của bạn.

+1

Anh chàng này chống lại ý tưởng tạo thêm ngoại lệ trong Python - http://www.youtube.com/watch?v=o9pEzgHorH0 –

5

Tôi dường như nhớ lại việc được đào tạo bởi tài liệu rằng bạn có thể nâng cao ngoại lệ được xác định trước, miễn là chúng phù hợp. Ví dụ, cách được khuyến nghị để chấm dứt không còn gọi exit() mà là để tăng SystemExit.

Ví dụ khác được đưa ra là sử dụng lại ngoại lệ IndexError trên các loại vùng chứa tùy chỉnh.

Tất nhiên, ứng dụng của bạn nên xác định ngoại lệ của riêng mình thay vì thực sự sử dụng lại các ngoại lệ của hệ thống. Tôi chỉ nói rằng không có cấm tái sử dụng chúng khi thích hợp.

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