Chuyển tới nội dung chính

Đị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ẩnNgoại lệ tùy chỉnh
Dễ dùngRất dễ, dùng ngayCần viết thêm class
Khả năng mở rộngKhó 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àngCó 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ácChuẩ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.
thông tin

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.