C++:
Xử lý lỗi

Làm thế nào:

Dưới đây là một khối cơ bản try-catch để xử lý một ngoại lệ:

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::runtime_error("Ối! Có gì đó không ổn.");
    } catch (const std::exception& e) {
        std::cerr << "Lỗi: " << e.what() << std::endl;
    }
    return 0;
}

Kết quả mẫu:

Lỗi: Ối! Có gì đó không ổn.

Sâu hơn

C++ đã có xử lý lỗi ngay từ những ngày đầu. Hình thức cơ bản nhất là kiểm tra giá trị trả về. Nếu bạn đã trải qua những ngày đó, bạn sẽ nhớ về thời kỳ trước chuẩn: C với các lớp và kiểm tra lỗi bằng tay.

Sau đó, ngoại lệ được giới thiệu vào C++ để cung cấp một cách có cấu trúc để đối phó với những vấn đề không mong đợi. Một ngoại lệ được ném ra với throw và bắt với try/catch.

Có hai loại lỗi thường xuất hiện: lỗi logic, như một phép tính sai, và lỗi thời gian chạy, như việc truy cập vào địa chỉ bộ nhớ không hợp lệ. Ngoại lệ lý tưởng cho lỗi thời gian chạy. Đối với lỗi logic, thường sử dụng đảm bảo hoặc mã lỗi là tốt hơn.

Có một cuộc tranh luận liên tục về ngoại lệ so với mã lỗi. Ngoại lệ có thể chậm hơn và có thể dẫn đến dòng điều khiển phức tạp. Mã lỗi, trong khi nhanh hơn, có thể làm cho mã trở nên rối rắm và khó bảo trì hơn. Đó là một sự đánh đổi, vì vậy biết trường hợp sử dụng của bạn là chìa khóa.

C++17 đã giới thiệu std::optionalstd::variant, là những phương án thay thế cho ngoại lệ. Chúng hữu ích cho các hàm có thể hoặc không thể trả về kết quả hợp lệ.

An toàn ngoại lệ có thể là một cơn đau đầu khác. Đó là về những bảo đảm mà mã của bạn cung cấp dù có ngoại lệ. Có ba mức độ: cơ bản, mạnh mẽ, và không ném lỗi. Càng nhiều bảo đảm, mã của bạn có thể càng phức tạp.

Nhận xét cuối cùng—xử lý lỗi cũng nhiều nghệ thuật như khoa học. Điều đó hình thành cách ứng dụng của bạn tồn tại trong thực tế. Đừng lạm dụng ngoại lệ. Hướng tới việc viết mã dễ đọc, dễ bảo trì.

Xem thêm