Định nghĩa ngoại lệ tùy chỉnh trong C++
Trong C++, bạn có thể định nghĩa ngoại lệ riêng phù hợp với ngữ cảnh chương trình bằng cách kế thừa từ các lớp ngoại lệ chuẩn như std::exception
. Điều này giúp cải thiện khả năng xử lý lỗi và phân biệt các loại lỗi khác nhau một cách rõ ràng.
1. Kế thừa từ std::exception
Để tạo một ngoại lệ tùy chỉnh, bạn chỉ cần tạo một lớp kế thừa từ std::exception
hoặc bất kỳ lớp con nào của nó như std::runtime_error
Ví dụ:
#include <exception>
#include <string>
class MyException : public std::exception {
private:
std::string message;
public:
explicit MyException(const std::string& msg) : message(msg) {}
const char* what() const noexcept override {
return message.c_str();
}
};
message
là chuỗi lưu trữ thông tin lỗi.what()
được override để trả về thông điệp lỗi.
2. Gợi ý: Dùng std::runtime_error
nếu có thể
Bạn có thể đơn giản hóa bằng cách kế thừa từ std::runtime_error
, vì lớp này đã hỗ trợ lưu trữ chuỗi thông báo:
#include <stdexcept>
class MyRuntimeException : public std::runtime_error {
public:
using std::runtime_error::runtime_error;
};
- Cách này giúp bạn không cần override lại
what()
.
3. Mẹo truyền thông điệp lỗi rõ ràng
- Luôn truyền rõ ngữ cảnh lỗi, ví dụ:
"Invalid user ID: " + std::to_string(userId)
- Tránh hardcode thông điệp trong class.
- Kết hợp
std::ostringstream
nếu cần xây dựng thông điệp phức tạp.
Ví dụ:
#include <sstream>
class DetailedException : public std::exception {
private:
std::string msg;
public:
DetailedException(int code, const std::string& context) {
std::ostringstream oss;
oss << "Error code " << code << " in " << context;
msg = oss.str();
}
const char* what() const noexcept override {
return msg.c_str();
}
};
4. So sánh: Ngoại lệ chuẩn vs. ngoại lệ tùy chỉnh
Tiêu chí | Ngoại lệ chuẩn | Ngoại lệ tùy chỉnh |
---|---|---|
Dễ dùng | Rất dễ, dùng ngay | Cần viết thêm class |
Khả năng mở rộng | Khó phân biệt các lỗi cụ thể | Có thể định nghĩa theo ngữ cảnh |
Phân loại lỗi rõ ràng | Có hạn, phải kiểm tra what() | Có thể catch theo từng loại riêng biệt |
Giao tiếp với mã khác | Chuẩn hoá | Tốt nếu thiết kế đúng |
5. Khi nào nên dùng ngoại lệ tùy chỉnh?
Nên dùng khi:
- Cần phân biệt rõ từng loại lỗi trong hệ thống lớn.
- Cần truyền thông tin lỗi chi tiết hơn thông điệp
what()
. - Bạn muốn
catch
riêng biệt từng loại lỗi để xử lý chuyên biệt.
Không nên dùng khi:
- Chương trình nhỏ, lỗi đơn giản, dùng
std::runtime_error
là đủ. - Việc định nghĩa class chỉ làm rối thêm mà không đem lại lợi ích rõ ràng.
Ngoại lệ tùy chỉnh là công cụ mạnh trong C++ khi xử lý lỗi ở các hệ thống phức tạp. Hãy dùng khi bạn cần mở rộng và phân loại lỗi rõ ràng. Nhưng cũng đừng lạm dụng — các ngoại lệ chuẩn đã rất mạnh và đủ dùng trong nhiều trường hợp đơn giản.