Exception Handling
1. try / catch nâng cao
- Dùng
try { ... } catch (const std::exception& e) { ... }để xử lý ngoại lệ chuẩn. - Ưu tiên bắt bằng tham chiếu để tránh slicing và giữ nguyên thông tin.
- Dùng
catch (...)để bắt mọi loại ngoại lệ nhưng nên hạn chế.
noexcept
- Dùng
noexceptđể chỉ định hàm không ném ngoại lệ. - Giúp tối ưu hiệu suất và tránh các tình huống không mong muốn.
noexceptcũng được dùng để kiểm tra exception safety trong template.
2. Custom Exception Class
- Thừa kế từ
std::exceptionvà overridewhat(). - Giúp mô tả lỗi chi tiết hơn trong ứng dụng cụ thể.
#include <iostream>
#include <exception>
#include <string>
class MyException : public std::exception {
std::string msg;
public:
MyException(const std::string& m) : msg(m) {}
const char* what() const noexcept override {
return msg.c_str();
}
};
int main() {
try {
throw MyException("Something went wrong");
} catch (const std::exception& e) {
std::cout << "Caught exception: " << e.what() << std::endl;
}
return 0;
}
⚠️ Lưu ý:
- Ngoại lệ nên dùng cho lỗi không thể xử lý thông thường, không dùng cho logic điều khiển bình thường.
- Tránh bắt ngoại lệ bằng con trỏ hoặc giá trị.
- Luôn cleanup tài nguyên (hoặc dùng RAII) khi ngoại lệ xảy ra.