Tôi đã từng được khuyên rằng một chương trình C ++ cuối cùng sẽ nắm bắt được tất cả các ngoại lệ. Lý do được đưa ra vào thời điểm đó về cơ bản là các chương trình cho phép các ngoại lệ nổi lên bên ngoài khi main()
bước vào trạng thái zombie kỳ lạ. Tôi đã được nói điều này vài năm trước và khi nhìn lại tôi tin rằng hiện tượng quan sát được là do sự phát sinh dài của các bãi lõi lớn đặc biệt từ dự án đang được đề cập đến.
Vào thời điểm này có vẻ kỳ quái nhưng có sức thuyết phục. Điều hoàn toàn vô lý là C ++ nên "trừng phạt" các lập trình viên vì không nắm bắt được tất cả các ngoại lệ nhưng bằng chứng trước mắt tôi dường như đã chứng minh điều này. Đối với dự án đang được đề cập, các chương trình đưa ra các ngoại lệ chưa được phát hiện dường như đã đi vào trạng thái zombie kỳ lạ - hoặc như tôi nghi ngờ nguyên nhân là bây giờ, một quá trình ở giữa một bãi chứa lõi không mong muốn khó có thể dừng lại.
(Đối với bất kỳ ai thắc mắc tại sao điều này không rõ ràng hơn vào thời điểm đó: Dự án đã tạo ra một lượng lớn đầu ra trong nhiều tệp từ nhiều quy trình che khuất một cách hiệu quả bất kỳ loại aborted (core dumped)
thông báo nào và trong trường hợp cụ thể này, kiểm tra sau xử lý các bãi rác lõi Đây không phải là một kỹ thuật sửa lỗi quan trọng nên các vấn đề cốt lõi không được suy nghĩ nhiều. Các vấn đề với một chương trình thường không phụ thuộc vào trạng thái được tích lũy từ nhiều sự kiện theo thời gian bởi một chương trình tồn tại lâu dài mà là các đầu vào ban đầu cho một chương trình tồn tại ngắn (< 1 giờ) vì vậy sẽ thực tế hơn khi chỉ chạy lại một chương trình có cùng các đầu vào từ bản dựng gỡ lỗi hoặc trong trình gỡ lỗi để có thêm thông tin.)
Hiện tại, tôi không chắc chắn liệu có bất kỳ lợi thế hay bất lợi lớn nào trong việc nắm bắt các ngoại lệ chỉ nhằm mục đích ngăn chặn các ngoại lệ rời đi main()
.
Ưu điểm nhỏ mà tôi có thể nghĩ đến khi cho phép các ngoại lệ nổi lên trong quá khứ main()
là nó gây ra kết quả std::exception::what()
được in ra thiết bị đầu cuối (ít nhất là với các chương trình được biên dịch gcc trên Linux). Mặt khác, điều này là tầm thường để đạt được bằng cách thay vào đó nắm bắt tất cả các ngoại lệ xuất phát từ std::exception
và in kết quả std::exception::what()
và nếu muốn in một tin nhắn từ một ngoại lệ không xuất phát từ std::exception
đó thì phải bắt trước khi rời đi main()
để in thông điệp.
Nhược điểm khiêm tốn mà tôi có thể nghĩ đến khi cho phép các ngoại lệ nổi lên trong quá khứ main()
là các bãi chứa lõi không mong muốn có thể được tạo ra. Đối với một quá trình sử dụng một lượng lớn bộ nhớ, điều này có thể gây phiền toái và kiểm soát hành vi bán phá giá lõi từ một chương trình yêu cầu các cuộc gọi chức năng dành riêng cho hệ điều hành. Mặt khác, nếu muốn có một kết xuất và thoát lõi, thì điều này thay vào đó có thể đạt được bất cứ lúc nào bằng cách gọi std::abort()
và một lối thoát không có kết xuất lõi có thể đạt được bất cứ lúc nào bằng cách gọi std::exit()
.
Thông thường, tôi không nghĩ rằng tôi đã từng thấy what(): ...
tin nhắn mặc định được in bởi một chương trình phân phối rộng rãi khi gặp sự cố.
Điều gì, nếu có, là những lý lẽ mạnh mẽ cho hoặc chống lại việc cho phép các ngoại lệ C ++ nổi lên trong quá khứ main()
?
Chỉnh sửa: Có rất nhiều câu hỏi xử lý ngoại lệ chung trên trang web này. Câu hỏi của tôi là cụ thể về các trường hợp ngoại lệ C ++ không thể xử lý và đã thực hiện mọi cách main()
- có thể một thông báo lỗi có thể được in nhưng đó là lỗi dừng hiển thị ngay lập tức.