Tại sao các ngoại lệ Python được đặt tên là “Lỗi”?


82

Tại sao Python trường hợp ngoại lệ có tên là "Lỗi" (ví dụ ZeroDivisionError, NameError, TypeError) chứ không phải "ngoại lệ" (ví dụ ZeroDivisionException, NameException, TypeException).

Tôi xuất thân từ nền tảng Java và bắt đầu học Python gần đây, điều này thật khó hiểu vì trong Java có sự phân biệt giữa lỗi và ngoại lệ.

Có sự khác biệt trong Python hay không?

Câu trả lời:


95
  1. Bạn không đặt tên cho mỗi lớp với tên 'Lớp' và mỗi biến có tên '_variable'. Giống như cách bạn không đặt tên ngoại lệ bằng từ 'Ngoại lệ'. Một cái tên nói lên điều gì đó về ý nghĩa của một đồ vật. 'Lỗi' là ý nghĩa của hầu hết các trường hợp ngoại lệ.

  2. Không phải tất cả các Ngoại lệ đều là Lỗi. SystemExit, KeyboardInterrupt, StopIteration, GeneratorExitLà tất cả những trường hợp ngoại lệ và không sai sót. Từ 'Lỗi' trong các lỗi thực tế cho thấy sự khác biệt.

  3. 'Lỗi' ngắn hơn 'Ngoại lệ'. Điều đó có thể lưu một vài ký tự trong chiều rộng mã mà không mất ý nghĩa. Điều đó tạo ra một số khác biệt.


2
Không phải tất cả Ngoại lệ đều là Lỗi : Thật vậy, có một số ngoại lệ bắt nguồn từ một lớp ngoại lệ được đặt tên Warning. Hãy xem câu trả lời của tôi .
DavidRR


1
Up-to-date trực quan cho Python3 là ở đây: docs.python.org/3.6/library/exceptions.html#exception-hierarchy
Sebastian Jylanki

49

Tôi tin rằng quy ước này xuất phát từ PEP 8 - Hướng dẫn kiểu cho mã Python :

Tên ngoại lệ

Bởi vì các ngoại lệ nên là các lớp, quy ước đặt tên lớp được áp dụng ở đây. Tuy nhiên, bạn nên sử dụng hậu tố "Lỗi" trên tên ngoại lệ của mình (nếu ngoại lệ thực sự là lỗi).


8

Về mặt này, Python khá giống với Java. Nhưng Exception của Python nên được so sánh với Throwable của Java.

Vì Throwables có đủ loại hương vị - Error, RuntimeException và (đã kiểm tra) Exception - Python cũng vậy (mặc dù không có ngoại lệ nào được kiểm tra).

Đối với ngôn ngữ, Lỗi là ngoại lệ, vì vậy hệ thống phân cấp kế thừa không có gì lạ.

Tôi không đặc biệt thích cái tên Exception. Các ngoại lệ không chỉ được sử dụng cho các trường hợp ngoại lệ (như hy vọng có Lỗi) mà còn để thoát ra khỏi luồng kiểm soát. Bởi vì đó là những gì một Ngoại lệ làm; nó nhảy ra khỏi luồng kiểm soát thông thường đến một điểm được đánh dấu. Một chút giống như goto, nhưng tinh tế hơn.

Điều đó có nghĩa là, mỗi khi bạn gặp tình huống không tìm thấy giá trị trả lại phù hợp, bạn có xu hướng sử dụng Ngoại lệ. Cả trong Python cũng như Java.


-1; Tôi không cảm thấy như điều này cung cấp bất kỳ thông tin chi tiết hữu ích nào. Bạn nói về 'các trường hợp ngoại lệ' mà không xác định chúng một cách rõ ràng, bạn đưa ra mô tả về cách các trường hợp ngoại lệ hoạt động ("nhảy ra khỏi luồng kiểm soát thông thường đến một điểm đã đánh dấu") không thực sự chính xác, bạn đưa ra sự phân biệt giữa Lỗi và RuntimeException trong Java như thể một số phân biệt tương tự tồn tại trong Python (nó không có), và bạn không bao giờ thực sự giải quyết câu hỏi tại sao các ngoại lệ của Python thường có Errortrong tên của chúng.
Mark Amery

4

Q. Tại sao các ngoại lệ Python có tên là “Lỗi”?

Tôi phỏng đoán điều này là do hầu hết các ngoại lệ Python được phân loại là lỗi hoặc cảnh báo . Nếu tên của các ngoại lệ Python được kết thúc bằng Exception, thì sự phân biệt này sẽ không thể thực hiện được.

Ví dụ về cảnh báo là DeprecationWarningImportWarning.

Xin vui lòng xem các hệ thống phân cấp lớp 2.x dành cho xây dựng trong trường hợp ngoại lệ cũng như cho 3.x .


3

Chỉ cần đặt:

  • Các ngoại lệ trong Python KHÔNG được đặt tên là "Lỗi".
  • Các lỗi trong Python được đặt tên là "Lỗi".
  • Các lỗi Python có thể được nêu ra, bắt và xử lý như các ngoại lệ.
  • Một cái gì đó bắt đầu như một lỗi có thể kết thúc là một ngoại lệ được xử lý không dẫn đến thông báo lỗi.
  • An Exceptioncũng có thể được nâng lên trực tiếp

Ý tưởng:

Tôi thường làm điều này nhưng tôi sẽ ngoại lệ

HOẶC LÀ

Đây thường là một lỗi, nhưng chúng tôi sẽ tạo một ngoại lệ, bắt nó và thực hiện một số thủ tục.

Chi tiết:

Ngoại lệ so với Lỗi:

https://docs.python.org/2/tutorial/errors.html

Các lỗi được phát hiện trong quá trình thực thi được gọi là ngoại lệ và không gây tử vong vô điều kiện

Quy trình làm việc:

  • Chương trình giám sát các lỗi.
  • Nếu một lỗi xảy ra nhưng KHÔNG được chương trình phát hiện trong quá trình thực thi, nó sẽ dẫn đến một thông báo lỗi.
  • Nếu một lỗi xảy ra và được chương trình phát hiện trong quá trình thực thi thì đó là một ngoại lệ.
  • Chương trình có thể xử lý các trường hợp ngoại lệ. Chúng có thể được xử lý khéo léo hoặc dẫn đến thông báo lỗi.
  • Các ngoại lệ KHÔNG được xử lý bởi chương trình là các ngoại lệ không được xử ( uncaught ) và trở thành thông báo lỗi.

1

Nó chỉ là đặt tên. Trong Java, bạn có java.lang.Errorsự khác biệt với các lỗi khác Throwablebởi vì những loại lỗi đó cần được bỏ chọn. Trong Python, tất cả các ngoại lệ đều không được kiểm tra, vì vậy sự phân biệt là vô nghĩa.


Lớp cơ sở được gọi là Exception (xem nhận xét của tôi về câu trả lời khác), vậy tại sao không đặt tên cho các con là Exception?
Elena

@Elena: Bởi vì sau đó bạn sẽ kết thúc với một cái gì đó giống như class ExceptionHandlingException extends RuntimeExceptionvà điều đó thật kinh khủng khi đọc.
Esko

2
Ngoài các lý do khác được đăng bởi những người khác, hãy nhớ rằng việc đặt tên trong thư viện chuẩn Python không phải lúc nào cũng nhất quán.
gustafc
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.