Có nhiều yêu cầu cần thiết cho một hệ thống để truyền đạt và xử lý các trường hợp ngoại lệ đúng cách. Ngoài ra còn có nhiều tùy chọn cho một ngôn ngữ để lựa chọn để thực hiện khái niệm.
Yêu cầu cho các trường hợp ngoại lệ (không theo thứ tự cụ thể):
Tài liệu : Một ngôn ngữ nên có ý nghĩa đối với các trường hợp ngoại lệ mà API có thể đưa ra. Lý tưởng nhất là phương tiện tài liệu này nên có thể sử dụng máy để cho phép trình biên dịch và IDE cung cấp hỗ trợ cho lập trình viên.
Truyền các tình huống đặc biệt : Điều này là hiển nhiên, để cho phép một chức năng truyền đạt các tình huống ngăn chức năng được gọi thực hiện hành động dự kiến. Theo tôi có ba loại lớn của các tình huống như vậy:
2.1 Lỗi trong mã khiến một số dữ liệu không hợp lệ.
2.2 Các vấn đề trong cấu hình hoặc các tài nguyên bên ngoài khác.
2.3 Tài nguyên vốn không đáng tin cậy (mạng, hệ thống tệp, cơ sở dữ liệu, người dùng cuối, v.v.). Đây là một chút của một trường hợp góc vì bản chất không đáng tin cậy của họ nên chúng ta mong đợi những thất bại lẻ tẻ của họ. Trong trường hợp này là những tình huống được coi là đặc biệt?
Cung cấp đủ thông tin cho mã để xử lý nó : Các ngoại lệ nên cung cấp đủ thông tin cho callee để nó có thể phản ứng và có thể xử lý tình huống. thông tin cũng phải đủ để khi ghi nhật ký ngoại lệ này sẽ cung cấp đủ ngữ cảnh cho lập trình viên để xác định và cô lập các tuyên bố vi phạm và cung cấp giải pháp.
Cung cấp niềm tin cho lập trình viên về trạng thái hiện tại của trạng thái thực thi mã của anh ta : Khả năng xử lý ngoại lệ của hệ thống phần mềm phải có mặt đủ để cung cấp các biện pháp bảo vệ cần thiết trong khi tránh xa lập trình viên để anh ta có thể tập trung vào nhiệm vụ tại tay.
Để bao quát những phương pháp sau đây đã được thực hiện bằng nhiều ngôn ngữ khác nhau:
Các trường hợp ngoại lệ được kiểm tra Cung cấp một cách tuyệt vời để ghi lại các trường hợp ngoại lệ và về mặt lý thuyết khi được thực hiện đúng sẽ cung cấp sự đảm bảo chắc chắn rằng tất cả đều tốt. Tuy nhiên, chi phí cao đến mức nhiều người cảm thấy hiệu quả hơn khi chỉ cần bỏ qua bằng cách nuốt các ngoại lệ hoặc ném lại chúng như các ngoại lệ không được kiểm soát. Khi được sử dụng các trường hợp ngoại lệ được kiểm tra không phù hợp sẽ làm mất đi tất cả sự hữu ích của nó. Ngoài ra, các ngoại lệ được kiểm tra gây khó khăn cho việc tạo API ổn định về thời gian. Việc triển khai một hệ thống chung trong một miền cụ thể sẽ mang lại cho nó tình huống đặc biệt khó có thể duy trì bằng cách sử dụng các ngoại lệ được kiểm tra duy nhất.
Các ngoại lệ không được kiểm tra - linh hoạt hơn nhiều so với ngoại lệ được kiểm tra, chúng không thể ghi lại đúng các tình huống đặc biệt có thể có của một triển khai nhất định. Họ dựa vào tài liệu đặc biệt nếu có. Điều này tạo ra các tình huống trong đó tính chất không đáng tin cậy của một phương tiện được che dấu bởi một API mang lại sự xuất hiện của độ tin cậy. Ngoài ra khi ném các ngoại lệ này mất đi ý nghĩa của chúng khi chúng di chuyển ngược lên qua các lớp trừu tượng. Vì chúng được ghi chép kém, một lập trình viên không thể nhắm mục tiêu chúng một cách cụ thể và thường cần phải tạo một mạng lưới rộng hơn nhiều so với mức cần thiết để đảm bảo rằng các hệ thống thứ cấp, nếu chúng thất bại, không làm hỏng toàn bộ hệ thống. Điều này đưa chúng ta trở lại với vấn đề nuốt phải kiểm tra ngoại lệ được cung cấp.
Các kiểu trả về đa cấp Ở đây phải dựa vào một tập hợp rời rạc, tuple hoặc khái niệm tương tự khác để trả về kết quả mong đợi hoặc một đối tượng đại diện cho ngoại lệ. Ở đây không ngăn xếp ngăn xếp, không cắt mã, mọi thứ thực thi bình thường nhưng giá trị trả về phải được xác nhận lỗi trước khi tiếp tục. Tôi chưa thực sự làm việc với điều này vì vậy không thể nhận xét từ kinh nghiệm. Tôi thừa nhận rằng nó giải quyết được một số vấn đề ngoại lệ khi bỏ qua dòng chảy bình thường nhưng nó vẫn sẽ gặp phải nhiều vấn đề tương tự như các trường hợp ngoại lệ được kiểm tra là mệt mỏi và liên tục "vào mặt bạn".
Vì vậy, câu hỏi là:
Kinh nghiệm của bạn trong vấn đề này là gì và theo bạn, ứng cử viên tốt nhất để tạo ra một hệ thống xử lý ngoại lệ tốt cho một ngôn ngữ là gì?
EDIT: Vài phút sau khi viết câu hỏi này, tôi đã xem qua bài đăng này , ma quái!
noexcept
câu chuyện trong C ++ có thể mang lại những hiểu biết rất tốt cho EH trong C # và Java.)