Trường hợp ngoại lệ ném rất tốn kém ở hầu hết các ngôn ngữ cấp thấp như C++. Điều đó ảnh hưởng rất nhiều đến "sự khôn ngoan thông thường" về ngoại lệ và không áp dụng quá nhiều cho các ngôn ngữ chạy trong máy ảo, như Python. Không có một chi phí lớn như vậy trong Python vì sử dụng một ngoại lệ thay vì một điều kiện.
(Đây là trường hợp "trí tuệ thông thường" trở thành vấn đề của thói quen. Mọi người đến từ kinh nghiệm trong một loại môi trường - ngôn ngữ cấp thấp - và sau đó áp dụng nó nó có ý nghĩa.)
Ngoại lệ, nói chung là ngoại lệ. Điều đó không có nghĩa là chúng không xảy ra thường xuyên; nó có nghĩa là chúng là ngoại lệ. Chúng là những thứ sẽ có xu hướng phá vỡ từ dòng mã thông thường, và phần lớn thời gian bạn không muốn phải xử lý từng cái một - đó là điểm xử lý ngoại lệ. Phần này giống với Python như trong C++ và tất cả các ngôn ngữ khác có ngoại lệ.
Tuy nhiên, điều đó có xu hướng xác định khi ngoại lệ là ném. Bạn đang nói về trường hợp ngoại lệ phải là bị bắt. Rất đơn giản, đừng lo lắng về nó: trường hợp ngoại lệ không đắt tiền, do đó, không đi đến độ dài để cố gắng ngăn chặn chúng bị ném. Rất nhiều mã Python được thiết kế xung quanh điều này.
Tôi không đồng ý với đề xuất của Jon để thử nghiệm và tránh các ngoại lệ trước. Đó là tốt nếu nó dẫn đến mã rõ ràng hơn, như trong ví dụ của mình. Tuy nhiên, trong nhiều trường hợp nó chỉ làm phức tạp mọi thứ - nó có hiệu quả có thể dẫn đến kiểm tra trùng lặp và giới thiệu lỗi. Ví dụ:
import os, errno, stat
def read_file(fn):
"""
Read a file and return its contents. If the file doesn't exist or
can't be read, return "".
"""
try:
return open(fn).read()
except IOError, e:
return ""
def read_file_2(fn):
"""
Read a file and return its contents. If the file doesn't exist or
can't be read, return "".
"""
if not os.access(fn, os.R_OK):
return ""
st = os.stat(fn)
if stat.S_ISDIR(st.st_mode):
return ""
return open(fn).read()
print read_file("x")
Chắc chắn, chúng tôi có thể kiểm tra và tránh thất bại - nhưng chúng tôi đã gặp những vấn đề phức tạp. Chúng tôi đang cố gắng đoán tất cả các cách truy cập tập tin có thể thất bại (và điều này không bắt được tất cả), chúng tôi có thể đã giới thiệu điều kiện chủng tộc, và chúng tôi đang làm rất nhiều công việc I/O. Điều này là tất cả được thực hiện cho chúng tôi - chỉ cần bắt ngoại lệ.
Mã của bạn trông lạ với tôi. 'heapify' biến đổi một danh sách * tại chỗ * thành một đống. Kết quả của 'pq = heapq.heapify (a_list)', 'pq' sẽ là' None'. – stephan
Bạn nói đúng! Lỗi ngớ ngẩn mà tôi đã thực hiện khi cố gắng chắt lọc mã thực sự của tôi vào một thứ phù hợp cho một ví dụ. Bây giờ nó đã được sửa. –