Nếu ngoại lệ không được bắt buộc thì tiêu chuẩn không xác định liệu ngăn xếp có bị bỏ trống hay không. Vì vậy, trên một số nền tảng destructors sẽ được gọi, và trên những người khác chương trình sẽ chấm dứt ngay lập tức. Việc nắm bắt ở cấp cao nhất đảm bảo rằng các destructor luôn được gọi.
Vì vậy, nếu bạn không chạy dưới trình gỡ rối, có thể bạn nên nắm bắt mọi thứ: (...) cũng như std :: exception. Sau đó, mã ứng dụng của bạn có thể làm sạch với RAII ngay cả trên một ngoại lệ chết người. Trong nhiều trường hợp như vậy bạn không thực sự cần phải dọn dẹp, vì hệ điều hành sẽ làm điều đó cho bạn. Nhưng ví dụ bạn có thể muốn ngắt kết nối sạch từ các dịch vụ từ xa nếu có thể và có thể có các tài nguyên bên ngoài quy trình, chẳng hạn như các đường ống/mutexes được đặt tên mà bạn muốn hủy thay vì bị rò rỉ.
Làm lại ngoại lệ trong trường hợp có vẻ như tôi bị hạn chế sử dụng, vì bạn đã mất ngữ cảnh trong đó ban đầu nó bị ném. Tôi giả sử rằng bẫy một ngoại lệ không bị bắt trong trình gỡ lỗi là noisier hơn là chỉ cần đăng nhập các lỗi để std :: cerr, do đó, rethrowing sẽ là di chuyển thông minh nếu có một cơ hội thiếu đăng nhập.
Nếu bạn muốn trình gỡ rối bẫy các điều kiện bất ngờ trong chế độ gỡ lỗi, trong chế độ phát hành, hãy thoát ngoại lệ mà cuối cùng dẫn đến thoát, có nhiều cách khác để thực hiện điều đó. .Ví dụ: bạn có thể sử dụng macro khẳng định. Tất nhiên, điều đó không giúp đỡ với các điều kiện bất ngờ và không thể đoán trước, như trường hợp ngoại lệ phần cứng nếu bạn đang sử dụng SEH trên .NET.
Nguồn
2008-12-15 12:57:27
Làm thế nào để nuốt nó? Mã in thông báo ngoại lệ, và sau đó thoát ra. bạn có thể làm gì hơn? Nếu bạn rút lại ngoại lệ, ai sẽ thấy nó? Nó sẽ bị bắt ở đâu? Đây là điểm vào của chương trình, sau khi tất cả. – jalf