Tôi đang phát triển một ứng dụng iOS gần đây đã phát triển một cơ sở C++ lớn. C++ không phải là sở trường của tôi, và tôi nhận được thất vọng bởi các ngoại lệ. Những gì tôi đang tìm kiếm là một cách để có được một theo dõi ngăn xếp đến trang web của một ném ngoại lệ (un-xử lý). Tôi sẽ nói rằng vòng loại "không xử lý" là tùy chọn; Tôi sẽ giải quyết để phá vỡ bất kỳ bất kỳ trường hợp ngoại lệ ném như là một phương sách cuối cùng, mặc dù ngoại lệ chưa xử lý là lý tưởng.Tôi có thể lấy dấu vết ngăn xếp cho các ngoại lệ C++ không được xử lý (Mục tiêu) không?
Điều tôi hiện đang nhận được là vô ích. Giả sử tôi không có bất kỳ xử lý ngoại lệ thích hợp cao hơn lên callstack, và tôi làm điều gì đó như
std::vector<int> my_vector;
my_vector.at(40) = 2; // Throws std::out_of_range
Ứng dụng sẽ phá vỡ trong main()
và tôi sẽ nhận được một thông điệp log nói "chấm dứt gọi là ném một ngoại lệ." Không hữu dụng.
Việc đặt các khối try/catch chung lên cao hơn cũng không giúp ích gì, bởi vì callstack bị bỏ trong quá trình xử lý ngoại lệ đến điểm của khối catch, khiến tôi không biết đến nguồn gốc thực sự của ngoại lệ. Điều này cũng áp dụng cho việc cung cấp terminate_handler
của riêng tôi. Các xác nhận hữu ích hơn, nhưng chúng yêu cầu tôi dự đoán các điều kiện lỗi ở một mức độ nào đó, điều mà tôi không thể luôn làm. Tôi vẫn muốn trình gỡ rối có thể bước vào ngay cả khi một ngoại lệ không mong muốn làm cho nó vượt qua các số assert()
trước tiên của tôi.
Điều tôi muốn tránh là phải bao bọc mọi cuộc gọi có thể có thể ném một ngoại lệ trong khối try/catch chỉ để có được dấu vết ngăn xếp đến lỗi. Khi chạy, tôi thực sự không quan tâm đến việc bắt những ngoại lệ này. Khi chúng xảy ra, nó có nghĩa là có một lỗ hổng nghiêm trọng trong việc thực hiện chương trình, và không có cách nào nó có thể tiếp tục bình thường. Tôi chỉ muốn được thông báo để tôi có thể xác định nguyên nhân và sửa đổi vấn đề để nó không xảy ra lần nữa.
Trong Objective C, tôi có thể đặt một breakpoint biểu tượng trên objc_exception_throw
, và bất cứ lúc nào tôi vít cái gì đó lên tôi ngay lập tức sẽ phá vỡ thực hiện và được trình bày với một vết đống đẹp vì vậy tôi biết nơi vấn đề là . Rất hữu ích.
Tôi nhận thấy hành vi này thực sự chỉ hữu ích vì sự khác biệt triết học trong xử lý ngoại lệ giữa hai ngôn ngữ. Các ngoại lệ C mục tiêu chỉ nhằm mục đích biểu thị các lỗi không thể khôi phục. Nhiệm vụ xử lý lỗi thông thường được thực hiện thông qua các mã trả về lỗi. Điều này có nghĩa là bất kỳ ngoại lệ C mục tiêu nào là ứng cử viên tuyệt vời cho điểm dừng cho nhà phát triển.
C++ dường như có cách sử dụng khác cho Ngoại lệ. Chúng được sử dụng để xử lý cả hai lỗi nghiêm trọng và lỗi thường gặp (ít nhất là trong libs của bên thứ ba mà tôi đang sử dụng). Điều này có nghĩa là tôi có thể không thực sự muốn phá vỡ mọi ngoại lệ được ném vào C++, nhưng tôi vẫn sẽ thấy khả năng hữu ích nếu tôi không thể chỉ phá vỡ các ngoại lệ chưa được xử lý.
C++ ngoại lệ không thực sự dành cho các lỗi _routine_, nhưng đôi khi chúng bị lạm dụng. Đúng là chúng không chỉ dành cho các lỗi không thể khôi phục. – bames53