Tôi giữ nó đơn giản.
Một thư viện có loại ngoại lệ cơ sở được mở rộng từ std ::: runtime_error (đó là từ C ++ áp dụng phù hợp với các ngôn ngữ khác). Ngoại lệ này có một chuỗi tin nhắn để chúng ta có thể đăng nhập; mỗi điểm ném có một thông điệp duy nhất (thường có một ID duy nhất).
Đó là về nó.
Lưu ý 1 : Trong trường hợp ai đó bắt ngoại lệ có thể khắc phục ngoại lệ và bắt đầu lại hành động. Tôi sẽ thêm các ngoại lệ xuất phát cho những thứ có khả năng được sửa chữa duy nhất tại một địa điểm từ xa. Nhưng điều này là rất rất hiếm (Hãy nhớ rằng người bắt không có khả năng ở gần điểm ném, do đó việc khắc phục vấn đề sẽ khó khăn (nhưng mọi thứ đều phụ thuộc vào tình huống)).
Lưu ý 2 : Đôi khi thư viện quá đơn giản nên không có giá trị ngoại lệ và std :: runtime_error sẽ làm. Điều quan trọng là chỉ có một ngoại lệ nếu khả năng phân biệt nó với std :: runtime_error có thể cung cấp cho người dùng đủ thông tin để làm điều gì đó với nó.
Lưu ý 3 : Trong một lớp tôi thường thích các mã lỗi (nhưng chúng sẽ không bao giờ thoát khỏi API công khai của lớp tôi).
Nhìn vào sự đánh đổi của bạn:
Sự đánh đổi mà tôi thấy bao gồm:
Các lớp ngoại lệ khác có thể cho phép xử lý lỗi ở mức rất tốt đối với người dùng API (dễ bị lỗi cấu hình hoặc dữ liệu của người dùng hoặc không tìm thấy tệp)
Có nhiều ngoại lệ thực sự cung cấp cho bạn kiểm soát hạt tốt hơn? Câu hỏi trở thành có thể mã bắt thực sự sửa lỗi dựa trên ngoại lệ. Tôi chắc chắn có những tình huống như vậy và trong những trường hợp này, bạn nên có một ngoại lệ khác. Nhưng tất cả các trường hợp ngoại lệ bạn đã liệt kê ở trên điều chỉnh hữu ích duy nhất là tạo ra một cảnh báo lớn và dừng ứng dụng.
Nhiều lớp ngoại lệ cho phép thông tin cụ thể lỗi được nhúng trong ngoại lệ, thay vì chỉ một thông báo chuỗi hoặc mã lỗi
Đây là lý do tuyệt vời để sử dụng ngoại lệ. Nhưng thông tin phải hữu ích cho người đang lưu trữ nó. Họ có thể sử dụng thông tin để thực hiện một số hành động khắc phục? Nếu đối tượng là nội bộ trong thư viện của bạn và không thể được sử dụng để ảnh hưởng đến bất kỳ API nào thì thông tin là vô ích. Bạn cần phải rất cụ thể rằng thông tin được ném có giá trị hữu ích cho người có thể nắm bắt nó. Người nắm bắt nó thường nằm ngoài API công khai của bạn, vì vậy điều chỉnh thông tin của bạn để nó có thể được sử dụng với những thứ trong API công khai của bạn.
Nếu tất cả những gì họ có thể làm là ghi nhật ký ngoại lệ thì tốt nhất chỉ nên ném một thông báo lỗi thay vì nhiều dữ liệu. Vì người bắt thường sẽ xây dựng một thông báo lỗi với dữ liệu. Nếu bạn xây dựng thông báo lỗi thì nó sẽ nhất quán trên tất cả các công cụ bắt, nếu bạn cho phép người bắt xây dựng thông báo lỗi, bạn có thể nhận được cùng một lỗi được báo cáo khác nhau tùy thuộc vào người đang gọi và bắt.
Ít ngoại lệ hơn, nhưng nhúng mã lỗi có thể được sử dụng như một tra cứu
Bạn phải xác định thời tiết mã lỗi có thể được sử dụng một cách có ý nghĩa. Nếu nó có thể thì bạn nên có ngoại lệ của riêng mình. Nếu không, người dùng của bạn bây giờ cần phải thực hiện các câu lệnh chuyển đổi bên trong bắt (điều này đánh bại toàn bộ vấn đề bắt tự động xử lý công cụ).
Nếu không thể thì tại sao không sử dụng một thông báo lỗi trong trường hợp ngoại lệ (không cần phải phân tách mã và thông báo khiến nó khó tìm kiếm).
Trả lại mã lỗi và cờ trực tiếp từ các chức năng (đôi khi không thể thực hiện được từ các luồng)
Trả lại mã lỗi là tuyệt vời trong nội bộ. Nó cho phép bạn sửa lỗi ở đó và sau đó và bạn phải chắc chắn rằng bạn đã sửa tất cả các mã lỗi và tài khoản cho chúng. Nhưng rò rỉ chúng trên API công khai của bạn là một ý tưởng tồi. Vấn đề là các lập trình viên thường quên kiểm tra các trạng thái lỗi (ít nhất là với một ngoại lệ, một lỗi không được kiểm soát sẽ buộc ứng dụng thoát khỏi một lỗi không được xử lý thường sẽ làm hỏng tất cả dữ liệu của bạn).
Đã triển khai một sự kiện hoặc hệ thống gọi lại khi có lỗi (tránh việc bỏ xếp chồng)
Phương pháp này thường được sử dụng cùng với các cơ chế xử lý lỗi khác (không phải là phương pháp thay thế). Hãy nghĩ về chương trình windows của bạn. Một người dùng bắt đầu một hành động bằng cách chọn một mục menu. Điều này tạo ra một hành động trên hàng đợi sự kiện. Hàng đợi sự kiện cuối cùng chỉ định một luồng để xử lý hành động. Các luồng được cho là để xử lý các hành động và cuối cùng trở lại nhóm luồng và chờ đợi một nhiệm vụ khác. Ở đây một ngoại lệ phải được bắt tại cơ sở bởi luồng được giao nhiệm vụ. Kết quả của việc bắt ngoại lệ thường sẽ dẫn đến một sự kiện được tạo cho vòng lặp chính, cuối cùng sẽ dẫn đến thông báo lỗi được hiển thị cho người dùng.
Nhưng trừ khi bạn có thể tiếp tục đối mặt với ngoại lệ, ngăn xếp sẽ được thư giãn (ít nhất là cho chủ đề).