Tôi đã làm việc trên một dự án Python đã phát triển một phần lớn và có nhiều lớp chức năng. Do một số quyết định đầu óc đẫm máu, tôi thấy rằng tôi phải sửa chữa nhiều lỗi vì các chức năng cấp thấp hơn đang trả về loại tôi không mong đợi ở các chức năng cấp cao hơn (thường là Không).Cách pythonic để bong bóng các điều kiện lỗi
Trước khi tôi đi qua và làm sạch điều này, tôi đã tự hỏi những gì là cách pythonic nhất của chỉ ra điều kiện lỗi và xử lý chúng trong các chức năng cao hơn?
Những gì tôi đã làm cho hầu hết các phần là nếu một hàm không thể hoàn thành và trả lại kết quả mong đợi của nó, tôi sẽ trả về Không. Điều này được một chút tổng, khi bạn kết thúc phải luôn luôn kiểm tra Không có trong tất cả các chức năng gọi nó.
def lowLevel():
## some error occurred
return None
## processing was good, return normal result string
return resultString
def highLevel():
resultFromLow = lowLevel()
if not resultFromLow:
return None
## some processing error occurred
return None
## processing was good, return normal result string
return resultString
Tôi đoán một giải pháp khác có thể là ném ngoại lệ. Với điều đó bạn vẫn nhận được rất nhiều mã trong các hàm gọi để xử lý ngoại lệ.
Không có gì có vẻ siêu thanh lịch. Người khác sử dụng cái gì? Trong obj-c một mẫu chung là trả về tham số lỗi theo tham chiếu, và sau đó người gọi sẽ kiểm tra điều đó.
Điều này bỏ lỡ mục đích chính của * re-raise * exceptions - để trình bày một API ngoại lệ hợp nhất cho người gọi. Ví dụ: nếu tôi triển khai dịch vụ web gửi trong mã của tôi bằng HTTP POST, thao tác gửi đó có thể tăng 'urllib2.HTTPError' (lỗi xử lý phía máy chủ),' urllib2.URLError' (URL sai, điểm cuối), 'ValueError '(URL không thể phân tích cú pháp hoặc thiếu),' httplibInvalidURL' (URL có thể phân tích cú pháp, nhưng không hợp lệ) và trong một số ít trường hợp, các lỗi khác. Nếu tôi không giải quyết những điều này, thì người gọi của tôi phải làm vậy. Xấu xí! Thay vào đó, tôi bắt tất cả chúng, nâng cao một ConnectionError và thêm một chuỗi ngữ cảnh khi cần thiết. –
Theo như cho phép họ chỉ thất bại đi - mà chỉ hoạt động nếu bạn có thể chịu đựng các lỗi thời gian chạy kết thúc quá trình của bạn. Điều này có thể hữu ích trong thử nghiệm, nhưng đối với hầu hết các phần mềm sản xuất, đó không phải là những gì bạn muốn. –
Đây là những điểm rất tốt và khá hợp lệ. Rõ ràng là một câu trả lời chấp nhận được phù hợp cần một ai đó để chi tiêu hơn 2 phút trả lời :) Tôi cảm thấy như thế này đáng lẽ phải được trả lời và thậm chí hỏi trước đó:/ –