Điểm quan trọng nào về ngoại lệ có cấu trúc nên mọi nhà phát triển C++ đều biết?Tôi nên biết gì về ngoại lệ có cấu trúc (SEH) trong C++?
Trả lời
Chúng tương đương với các tín hiệu Unix, và cho phép bạn nắm bắt các ngoại lệ CPU như vi phạm truy cập, hướng dẫn bất hợp pháp, chia cho số không.
Với các tùy chọn trình biên dịch phù hợp (/ EHa cho Visual C++), ngoại lệ C++ sử dụng cùng cơ chế như chồng thư giãn hoạt động đúng cho cả ngoại lệ C++ (người dùng) và ngoại lệ SEH (OS).
Không giống như ngoại lệ C++, SEH không được nhập nhưng tất cả đều chia sẻ cấu trúc dữ liệu giống như mã ngoại lệ (nguyên nhân) và thông tin bổ sung về mã bị lỗi và những gì sổ đăng ký CPU được giữ tại thời điểm xảy ra lỗi. Xem GetExceptionCode
và GetExceptionInformation
để biết thêm chi tiết về điều này.
Ngoài ra, SEH có xử lý "cơ hội đầu tiên", cho phép bạn đăng nhập hoặc xử lý ngoại lệ trước khi hủy phá hủy tất cả biến cục bộ.
Họ nên biết rằng chúng không phải là một phần của Tiêu chuẩn C++ - chúng là sáng chế của Microsoft và có thể được sử dụng bằng các ngôn ngữ khác ngoài C++.
A Crash Course on the Depths of Win32™ Structured Exception Handling
bài viết Đó là các tham khảo trên nhận được lên đến tốc độ với SEH. 13 năm sau, vẫn là tốt nhất có.
Có chủ đề riêng về MSDN cho SEH vs. C++ Exception Handling Differences.
Một số điều C++ phát triển nên biết nếu SEH đang được thảo luận:
Viết C/C++ SEH Exception Handlers:
__try
{
// guarded code
}
__except (expression)
{
// exception handler code
}
này được xử lý ngoại lệ không C++, là MS mở rộng cụ thể cho hooking thẳng inot SEH. Nó hoạt động rất khác với trường hợp ngoại lệ C++ chạy của bạn. Bạn cần hiểu rõ về SEH để sử dụng chúng.
Viết C/C++ SEH Termination Handlers:
__try {
// guarded code
}
__finally (expression) {
// termination code
}
Tương tự như với các handler SEH, đừng nhầm lẫn này với C ngữ nghĩa ngoại lệ ++. Bạn cần hiểu rõ về SEH.
_set_se_trasnlator
: đây là chức năng dịch ngoại lệ SEH thành ngoại lệ loại C++ khi ngoại lệ không đồng bộ được sử dụng /EHa.
Và cuối cùng, ý kiến cá nhân: nhà phát triển C++ có biết SEH không? Sau khi tân binh đầu tiên của bạn .ecxr bạn sẽ hiểu rằng khi đẩy đến xô đẩy ngoại lệ C++ chỉ là một ảo ảnh được cung cấp để thuận tiện cho bạn. Điều duy nhất đang diễn ra là SEH.
'__finally' không có' (biểu thức) ' – Abyx
thời gian gần đây tôi đã có một vấn đề mà là do gián tiếp bởi SEH, đặc biệt vì một tính năng của SEH mà tôi nghĩ mỗi nhà phát triển cần phải nhận thức:
Khi SEH được sử dụng destructors không được gọi, vì vậy nếu bạn có dọn dẹp mã trong destructor của bạn nó sẽ không được làm sạch.
Vấn đề của chúng tôi là do một phần quan trọng được bao bọc bởi một đối tượng có khóa trong hàm khởi tạo và mở khóa trong trình phá hủy.
Chúng tôi đã có tình huống bế tắc và không thể hiểu tại sao, và sau khoảng một tuần đào qua mã và bãi và gỡ lỗi, cuối cùng chúng tôi đã hiểu rằng có một ngoại lệ do COM xử lý và gây ra Critical để giữ khóa. Chúng tôi đã thay đổi một cờ biên dịch trong VS trong các thuộc tính của dự án để cho nó chạy các destructors ngay cả đối với SEH và giải quyết được vấn đề.
Vì vậy, mặc dù bạn không thể sử dụng SEH trong mã của mình, bạn có thể đang sử dụng thư viện (như COM) và có thể gây ra hành vi không mong muốn.
- 1. Tôi nên bắt những ngoại lệ nào?
- 2. Tôi cần biết gì về C++ 0x?
- 3. Tôi nên ném loại ngoại lệ nào?
- 4. Câu hỏi về mẫu cấu trúc lớp. Tôi nên chọn gì?
- 5. Bán mã nguồn, Tôi nên biết gì về số
- 6. Tôi có thể giải mã ngoại lệ C++ từ ngoại lệ Windows SEH không? (? Và nếu như vậy, làm thế nào)
- 7. C# Tôi nên nâng cấp ngoại lệ ở đây?
- 8. Tôi có nên lấy ngoại lệ tùy chỉnh từ Ngoại lệ hoặc ApplicationException trong .NET không?
- 9. Tôi có thể 'mở rộng' một cấu trúc trong C?
- 10. Tôi thiếu gì về điểm ngắt ngoại lệ C++ trong Xcode 4.3?
- 11. Cấu trúc trả về từ hàm (C)
- 12. Câu hỏi về cấu trúc plugin C#
- 13. Tôi có nên trả về null hoặc ném một ngoại lệ không?
- 14. C# Tôi có nên Loop cho đến khi không có ngoại lệ?
- 15. về ngoại lệ C++. func() throw()
- 16. Làm cách nào để có được ngoại lệ có cấu trúc từ Moose?
- 17. Tôi nên khởi tạo đúng cấu trúc C từ C++ như thế nào?
- 18. Xử lý ngoại lệ CPU trong C++
- 19. Tôi nên biết gì về việc gửi email trong một chuỗi nền? ASP.NET
- 20. Bối rối về khi nào nên ném một ngoại lệ
- 21. Sử dụng ghi nhớ về cấu trúc trong C++
- 22. Tôi nên cấu trúc các dự án phức tạp như thế nào trong C?
- 23. Cấu trúc có biến mẫu trong C++
- 24. tuyên bố trước về cấu trúc trong C?
- 25. Sao chép cấu trúc vào cấu trúc trong C
- 26. Tôi không biết những gì khối của tôi nên tránh cho phạm vi chữ trong mục tiêu-c
- 27. Cấu trúc src/thư mục trong C++?
- 28. Từ khóa "mới" làm gì với cấu trúc trong C#?
- 29. Ngoại lệ trong các trường hợp ngoại lệ trong C++
- 30. Có thể/Bạn có nên ném ngoại lệ trong câu lệnh chuyển đổi C# không?
Lưu ý mặc dù mặc định đã được thay đổi cách xử lý các ngoại lệ SEH như ngoại lệ C++ vì ngoại lệ SEH không an toàn để xử lý như ngoại lệ C++. SEH ngoại lệ thường là những thứ như vi phạm truy cập, và cố gắng làm C++ thư giãn trong điều kiện như vậy là không thể và có thể gây ra chương trình chấm dứt. –
Không có gì vốn không an toàn khi giải quyết vi phạm quyền truy cập. Tất nhiên, nếu vi phạm truy cập do tham nhũng của cấu trúc dữ liệu nội bộ (đặc biệt là ngăn xếp tràn có ảnh hưởng đến thông tin ngăn xếp cuộc gọi) thì việc tháo gỡ có thể thất bại, nhưng nhiều, nếu không phải là đa số, ngoại lệ SEH không thực sự phản ánh tham nhũng. –
Vui lòng đọc http://stackoverflow.com/questions/4414027/visual-c-unmanaged-code-use-eha-or-ehsc-for-c-exceptions về tác dụng phụ khó chịu của SEH với bỏ qua dấu ba chấm-Ngoại lệ (ví dụ catch (...) {}) –