Khi nào tôi nên phân lớp một ngoại lệ trong Python?


10

Trong mã của tôi có khoảng bảy nơi tôi nêu ra một ngoại lệ. Tất cả các ngoại lệ này đều được xử lý như nhau: in lỗi vào tệp nhật ký, đưa trạng thái phần mềm về mặc định và thoát.

Trong quá trình xem xét mã kỹ sư cao cấp của tôi, người mà tôi đánh giá cao, nói rằng tôi nên phân lớp tất cả các ngoại lệ này. Lập luận của ông là trong tương lai chúng ta có thể muốn xử lý các ngoại lệ khác nhau và điều đó sẽ dễ dàng hơn.

Lập luận của tôi là hiện tại nó sẽ chỉ làm lộn xộn mã của chúng tôi và vì chúng tôi không biết liệu chúng tôi có xử lý các ngoại lệ khác nhau hay không, chúng tôi nên để lại mã ngắn gọn và, khi và khi đến lúc, chúng tôi nên phân loại .

Tôi muốn nghe bất kỳ đối số cho mỗi trường hợp.


2
YAGNI ... Bạn không cần nó ngay bây giờ và bạn luôn có thể thêm nó sau mà không gặp quá nhiều khó khăn.
Robert Harvey

bạn có bất kì ví dụ nào không? Bạn chỉ đang nêu ra Exception, ví dụ, hoặc các lỗi tích hợp cụ thể hơn?
jonrsharpe

chỉ cần đưa ra một Ngoại lệ ("mô tả cụ thể")
Ezra

@Ezra ít nhất, bạn sẽ thấy nếu có một hơn Lắp built-in ngoại lệ (xem docs.python.org/2/library/exceptions.html ).
jonrsharpe

Câu trả lời:


8

Bạn đúng

Đối số về phía bạn đã được Robert Harvey đề cập: không thêm mã mà bạn không cần ngay bây giờ, đặc biệt là vì dễ dàng thêm mã này sau.

Người đánh giá của bạn cũng đúng

Mặt khác, quan điểm của người đánh giá cũng dễ hiểu:

  • Trả lại một cái chung Exception()không hữu ích lắm cho người gọi: trong khi mô tả ngoại lệ chỉ ra cho con người những gì đang diễn ra, việc xử lý các ngoại lệ khác nhau theo chương trình có thể là không thể. Nhà phát triển sử dụng mã của bạn có thể miễn cưỡng thay đổi các loại ngoại lệ , bao gồm cả nỗi sợ (có hợp lý hay không) về việc phá vỡ một cái gì đó.

    Lưu ý rằng việc thêm ngoại lệ tùy chỉnh ngay bây giờ không khó :

    class MyCustomException(Exception):
        pass

    là tất cả những gì bạn cần. Đó chỉ là hai dòng mã (cho rằng bạn thậm chí không cần tạo một tệp riêng nếu bạn đặt ngoại lệ tùy chỉnh trong một tệp).

  • Các mã chính nó trông tốt hơn, dễ đọc hơn.

    if price < self.PriceMinValue:
        raise OutOfRangeException("The price is inferior to zero.")

    trông hơi dễ đọc hơn so với:

    if price < self.PriceMinValue:
        raise Exception("The price is inferior to zero.")

    bởi vì dấu hiệu của loại ngoại lệ:

    • Trong đoạn mã thứ hai, tôi cần đọc mô tả và đoán rằng giá nằm ngoài phạm vi (hoặc có thể không phải vậy? Có thể có trường hợp giá có thể âm, chẳng hạn như giảm giá?)

    • Trong đoạn mã đầu tiên, một cái nhìn thoáng qua về loại đưa ra một dấu hiệu ngay lập tức về lỗi. Dường như có một tập hợp các giá trị được phép cho một mức giá và giá trị hiện tại nằm ngoài tập hợp này.

Vì thế?

Vì thế:

  • Cả hai cách tiếp cận đều hợp lệ. Nếu bạn không phân lớp ngoại lệ khi bạn không cần loại tùy chỉnh, bạn đã đúng. Khi bạn thực hiện phân lớp ngoại lệ vì không tốn kém gì để thực hiện và có thể hữu ích sau này, bạn có quyền.

  • Hãy nhất quán với nhóm của bạn. Nếu nhóm của bạn sử dụng ngoại lệ tùy chỉnh rộng rãi, hãy sử dụng chúng.


2
Nhưng có một phương tiện hạnh phúc : raise ValueError('The price is less than zero'). Điều này là cụ thể hơn so với cơ sở Exception, nhưng không có bất kỳ phiền phức.
jonrsharpe

+1 cho câu lệnh đơn giản "nhất quán", với một nhóm nếu bạn có, với chính mình nếu bạn không.
Styne666
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.