Tôi thường thích xử lý các ngoại lệ bên trong (tức là thử / ngoại trừ bên trong hàm được gọi, có thể trả về Không có) vì python được nhập động. Nói chung, tôi coi đó là một cuộc gọi phán đoán theo cách này hay cách khác, nhưng trong một ngôn ngữ được nhập động, có những yếu tố nhỏ có lợi cho việc không chuyển ngoại lệ cho người gọi:
- Bất kỳ ai gọi hàm của bạn đều không được thông báo về các ngoại lệ có thể được ném ra. Nó trở thành một hình thức nghệ thuật để biết bạn đang tìm kiếm loại ngoại lệ nào (và nên tránh những khối ngoại trừ chung chung).
if val is None
dễ dàng hơn một chút except ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace
. Nghiêm túc mà nói, tôi ghét phải nhớ nhập from django.core.exceptions import ObjectDoesNotExist
vào đầu tất cả các tệp django của mình chỉ để xử lý một trường hợp sử dụng thực sự phổ biến. Trong một thế giới được nhập tĩnh, hãy để trình chỉnh sửa làm điều đó cho bạn.
Thành thật mà nói, nó luôn luôn là một lệnh gọi phán đoán và tình huống bạn đang mô tả, trong đó hàm được gọi nhận lỗi mà nó không thể giúp được, là một lý do tuyệt vời để nêu lại một ngoại lệ có ý nghĩa. Bạn có ý tưởng chính xác đúng, nhưng trừ khi bạn ngoại lệ sẽ cung cấp nhiều thông tin có ý nghĩa hơn trong một dấu vết ngăn xếp hơn
AttributeError: 'NoneType' object has no attribute 'foo'
mà, chín lần trong số mười, là những gì người gọi sẽ thấy nếu bạn trả về một Không có gì không được xử lý, đừng bận tâm.
(Tất cả những điều này khiến tôi ước rằng các ngoại lệ python có các cause
thuộc tính theo mặc định, như trong java, cho phép bạn chuyển các ngoại lệ thành các ngoại lệ mới để bạn có thể nhập lại tất cả những gì bạn muốn và không bao giờ mất nguồn gốc của vấn đề.)