Tôi có xu hướng thêm nhiều xác nhận vào mã C ++ của mình để giúp việc gỡ lỗi dễ dàng hơn mà không ảnh hưởng đến hiệu suất của các bản phát hành. Bây giờ, assert
là một macro C thuần túy được thiết kế mà không có cơ chế C ++.
Mặt khác std::logic_error
, C ++ định nghĩa , có nghĩa là được ném trong trường hợp có lỗi trong logic của chương trình (do đó có tên). Việc ném một thể hiện có thể chỉ là sự thay thế hoàn hảo, nhiều hơn C ++ assert
.
Vấn đề là assert
và abort
cả hai đều chấm dứt chương trình ngay lập tức mà không gọi trình hủy, do đó bỏ qua việc dọn dẹp, trong khi việc ném một ngoại lệ theo cách thủ công sẽ làm tăng thêm chi phí thời gian chạy không cần thiết. Một cách giải quyết vấn đề này sẽ tạo ra một macro xác nhận của riêng mình SAFE_ASSERT
, hoạt động giống như đối tác C, nhưng ném một ngoại lệ khi bị lỗi.
Tôi có thể nghĩ đến ba ý kiến về vấn đề này:
- Bám vào lời khẳng định của C. Vì chương trình bị chấm dứt ngay lập tức, không quan trọng liệu các thay đổi có được thực hiện chính xác hay không. Ngoài ra, sử dụng
#define
s trong C ++ cũng không tốt. - Ném một ngoại lệ và bắt nó trong hàm main () . Việc cho phép mã bỏ qua hàm hủy ở bất kỳ trạng thái nào của chương trình là một cách làm không tốt và phải tránh bằng mọi giá, và các lệnh gọi đến chấm dứt () cũng vậy. Nếu trường hợp ngoại lệ được ném ra, chúng phải được bắt.
- Ném một ngoại lệ và để nó kết thúc chương trình. Một trường hợp ngoại lệ chấm dứt một chương trình là được và do đó
NDEBUG
, điều này sẽ không bao giờ xảy ra trong một bản phát hành. Việc nắm bắt là không cần thiết và tiết lộ chi tiết triển khai của mã nội bộmain()
.
Có câu trả lời chắc chắn cho vấn đề này không? Bất kỳ tài liệu tham khảo chuyên nghiệp?
Đã chỉnh sửa: Tất nhiên, bỏ qua hàm hủy không phải là hành vi không xác định.
logic_error
là lỗi logic. Một lỗi trong logic của chương trình được gọi là lỗi. Bạn không giải quyết lỗi bằng cách ném các ngoại lệ.