pthread_exit
có thể ném một ngoại lệ ___forced_unwind, được sử dụng để tháo ngăn xếp trong khi thoát khỏi chuỗi. Nó không được kế thừa từ std::exception
, và do đó không thể bị phát hiện là một. Nếu bạn làm điều bắt ngoại lệ đó, hãy chắc chắn để tái throw
nó để nó có thể làm công việc của mình:
try {
...
} catch (abi::___forced_unwind&) {
throw;
} catch (...) {
// whatever
}
Lý do một ngoại lệ được ném là pthread_exit
được quy định không bao giờ trở lại. Có nó ném đảm bảo dọn dẹp các biến phân bổ stack, và không thực hiện mã sau khi vị trí của nó (trừ khi bạn bắt được ngoại lệ thư giãn ...).
BTW, đây là trường hợp khác trong đó thành ngữ catch (...)
có hại nhiều hơn lợi. Nó đôi khi được sử dụng để "ổn định" mã đó là ném ngoại lệ không xác định. Nhưng điều đó chỉ làm giảm khả năng hiển thị của thiệt hại cho một thời gian và địa điểm sau đó, làm cho nó không thể xác định nguồn gốc thực sự của vấn đề. Điều hợp lý duy nhất để thực hiện trong việc nắm bắt này là dọn dẹp tối thiểu, có thể đăng nhập và sau đó khôi phục lại. Một quá trình bị treo do một ngoại lệ chưa được giải quyết không phải là một cảnh đẹp, nhưng nó có thể cung cấp một bãi chứa sự cố có thể gỡ lỗi hiển thị rõ ràng lệnh bị lỗi. Nhưng đó chỉ là mối hận thù của tôi đối với catch (...)
, điều này hầu như không liên quan đến pthread_exit
...
Trình biên dịch nào bạn thấy dưới đây? –
@Fabio Có lẽ một số destructor của một đối tượng trên stack là ném. –
@DaveS g ++ TorstenRobitzki cảm ơn bạn, tôi mặc dù vậy, nhưng trường hợp là một trong những giải thích bởi eran –