Search…

Exception Handling trong C++

04/09/20204 min read
Xử lý ngoại lệ - exception handling hiệu quả với try, catch, throw thông qua ví dụ trong C++.

Mọi đoạn chương trình được viết ra đều tiềm ẩn khả năng sinh lỗi. Có thể là lỗi chủ quan do lập trình sai hoặc có thể là lỗi khách quan do dữ liệu hay trạng thái của hệ thống (thiếu memory, mạng bị corrupt …). Không dễ dàng để kiểm soát tất cả trường hợp của chương trình, đặc biệt các lỗi liên quan đến số học, bộ nhớ, … Vì thế, việc giải quyết các ngoại lệ để ứng dụng chúng ta tránh được những rủi ro là 1 điều không kém phần quan trọng.

Tổng quan

Exception – Ngoại lệ là cơ chế thông báo và xử lý những vấn đề tiềm ẩn phát sinh (giống như lỗi runtime) trong chương trình bằng cách chuyển quyền điều khiển đến những hàm đặc biệt nhằm tách phần xử lý lỗi ra khỏi thuật toán chính.

Một ngoại lệ là một đối tượng chứa thông tin về lỗi và truyền thông tin của lỗi cho bộ phận xử lý để có những hướng giải quyết phù hợp.

Ngoại lệ có thể thuộc bất kì kiểu dữ liệu bất kỳ của C++:

  • Có sẵn như int, char, int* , char* ,…
  • Kiểu người dùng tự định nghĩa.
  • Các lớp ngoại lệ trong thư viện <exception>

Cơ chế của ngoại lệ

Cơ chế

Quy trình gọi hàm và trả về trong trường hợp bình thường:

Quy trình ném và bắt ngoại lệ tại member_function():

Cơ chế xử lý ngoại lệ của C++ có 3 tính năng chính:

  • Khả năng tạo và ném ngoại lệ (sử dụng từ khóa throw).
  • Khả năng bắt và giải quyết ngoại lệ (sử dụng từ khóa catch).
  • Khả năng tách phần xử lý ngoại lệ ra khỏi phần có thể sinh lỗi (sử dụng từ khóa try).

Hướng giải quyết

Muốn bắt exception tại vị trí nào của chương trình thì ta phải đặt tại đó 1 đoạn code nhằm kiểm tra ngoại lệ. Đoạn chương trình này được đóng gói trong 1 khối try-block. Khi một ngữ cảnh thực thi tiếp nhận và truy nhập một ngoại lệ được coi là bắt ngoại lệ (catch the exception) thì nó được truyền đến phần xử lý ngoại lệ (exception handler). Song, nếu không xảy ra bất cứ ngoại lệ nào thì chương trình được build bình thường và các bộ xử lý đều được bỏ qua.

Và quá trình truyền ngoại lệ từ ngữ cảnh thực thi hiện hành đến mức thực thi cao hơn - được gọi là ném 1 ngoại lệ (throw an exception) – bằng cách sử dụng từ khóa throw. Phần xử lý ngoại lệ được khai báo trong từ khóa catch dùng để xử lý ngay khi sau try-block.

Ví dụ đoạn chương trình sau:

// Exceptions
#include <iostream>
#include <string>
using namespace std;

int main()
{
	try
	{
		throw string("String!");
	}
	catch (string e)
	{
		cout << "An exception occurred. Exception: " << e << '\n';
	}
	catch(...)
	{
		cout << "An exception occurred." << '\n';
	}
	return 0;
}

Đoạn code dưới xử lý ngoại lệ bên trong khối lệnh try. Ở ví dụ trên chỉ đơn giản là ném 1 ngoại lệ:

throw string("String!");

Biểu thức ném ngoại lệ chấp nhận 1 tham số (trong trường hợp này là 1 chuỗi kí tự “String!”)  được thông qua để xử lý ngoại lệ.

Đoạn xử lý ngoại lệ được khai báo vời từ khóa catch ngay sau kết thúc khối try. Cú pháp bắt ngoại lệ cũng tương tự như khai báo 1 hàm thông thường với 1 tham số. Loại tham số truyền vào catch rất quan trọng vì các loại của đối số này thông qua biểu thức ném để kiểm tra và chỉ khi phù hợp thì các ngoại lệ được bắt mới được xử lý.

Khi ngoại lệ được ném đi, hệ thống xử lý ngoại lệ sẽ kiểm tra các kiểu được liệt kê trong khối catch theo thứ tự liệt kê:

  • Khi tìm thấy kiểu đã khớp, ngoại lệ được coi là được giải quyết, không cần tiếp tục tìm kiếm.
  • Nếu không tìm thấy, mức thực thi hiện hành bị kết thúc, ngoại lệ được chuyển lên mức cao hơn.

Do khó có thế kiểm soát mọi trường hợp xảy ra trong chương trình và để mức thực thi hiện hành không bị kết thúc giữa chừng ta có thể sử dụng dấu “…” làm đối số truyền vào catch, phần xử lý này sẽ bắt bất kỳ ngoại lệ nào được ném (bao gồm cả những ngoại lệ không thể giải quyết).

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024