2010-11-09 46 views
11

Khi ngoại lệ thoát khỏi hàm trong DLL, thời gian chạy mingw32 chỉ cần gọi chấm dứt std :: không mong muốn thay vì truyền ngoại lệ cho mã đang gọi DLL. Có những giải pháp nào cho vấn đề này? Các DLL và ứng dụng gọi nó là cả hai biên dịch với cùng một trình biên dịch.Bắt ngoại lệ được ném từ các tệp DLL

Có hai cơ chế ngoại lệ khác nhau được hỗ trợ bởi mingw32: SJLJ và Dwarf2. Nên một trong số họ làm việc tốt hơn so với khác cho điều này? Có lẽ lựa chọn duy nhất là để chuyển sang MSVC hoặc ICC hoặc có thể thay đổi tùy chọn xây dựng một mình sẽ giúp đỡ?

Lưu ý rằng thậm chí không bắt (...) sẽ bắt bất kỳ ngoại lệ nào, thậm chí không được tích hợp sẵn (ném 1;), vì vậy nó không phải về khả năng hiển thị của loại ngoại lệ.

+0

Thú vị. Có thể là mỗi thư viện có thời gian chạy C++ được liên kết tĩnh? – sharptooth

Trả lời

0

Có các đường nối là vấn đề với gcc bảo quản thông tin về loại ngoại lệ khi ngoại lệ được ném từ một thư viện được chia sẻ khác.

Xem this bug report và thử googling cho "gcc ngoại lệ chia sẻ thư viện" (tôi vẫn chưa tìm ra giải pháp cho vấn đề đó)

5

là thời gian chạy giả định rằng extern "C" chức năng sẽ không bao giờ ném ngoại lệ? Tôi không quen thuộc với MinGW nhưng tôi biết rằng Visual Studio có một loạt các đối số dòng lệnh để kiểm soát loại hành vi này. Ví dụ: tùy chọn /EHs sẽ khiến cho giả định rằng extern "C" sẽ không bao giờ ném và nó sẽ xử lý các chức năng mà ném bằng cách gọi std::unexpected() mà lần lượt gọi std::terminate(). Bạn có thể muốn gọi std::set_unexpected() để thiết lập một trình xử lý ngoại lệ không mong muốn và xem nó có bẫy hay không.

Các vấn đề liên quan