Trong khi thực hiện chương trình, không phải lúc nào chương trình cũng chạy đúng. Có thể có những lỗi không mong muốn xảy ra. Một số lỗi chúng ta có thể tìm ra và sửa. Còn một số khác phát sinh ngẫu nhiên, không phụ thuộc vào chương trình. Ví dụ như đọc ghi đĩa bị lỗi, không đủ bộ nhớ, tràn stack, ... Đối với những lỗi như thế, khi xảy ra sẽ làm chương trình ngừng chạy. Delphi cung cấp một cấu trúc bắt lỗi để xử lý những lỗi như thế này và có biện pháp xử lý, như thông báo cho người dùng, và chương trình có thể chạy tiếp tục.
Delphi có hai cấu trúc bắt lỗi: try ... except ... end và try ... finally ... end; Với mỗi loại sẽ có cách sử dụng khác nhau. Bài này chỉ đề cập try ...except, còn try ... finally mình sẽ bàn trong bài Quản lý bộ nhớ.
Chú ý: Cấu trúc bắt lỗi sẽ chỉ hoạt động trong chế độ debug. Nếu là release, các lỗi đơn giản bị bỏ qua.
Như đã nói, thì có những đoạn lệnh khi chạy sẽ sinh ra lỗi. Khi đó, chương trình sẽ ném ra một ngoại lệ (exception) và dừng lại.
begin
try
...
except
on E: Exception do
writeln(E.Message);
end;
end.
Phần ba chấm (...) là những câu lệnh có khả năng sinh ra lỗi.
Lưu ý: Khi bạn nhấn F9 (chạy chương trình với debugger) thì mặc dù có xử lý ngoại lệ bằng try ... except thì exception vẫn sẽ bị bắt bởi trình biên dịch (compiler)
Như ví dụ trên, object E thuộc class Exception. Đặc biệt, các object của Exception không cần phải được khởi tạo bằng Create hay giải phóng bằng Free. Điều này sẽ được thực hiện tự động.
Unit System.SysUtils, định nghĩa một số exception khác, là subclass của Exception như EZeroDivide, EDivByZero, EAssertionFailed, ERangeError, EStackOverflow, ... (tên exception bắt đầu bằng chữ E)
Ví dụ với đoạn code dưới đây sẽ sinh ra ngoại lệ EZeroDivide.
var
a, b, c: Single;
begin
try
a := 5;
b := 0;
c := a / b;
except
on E: EZeroDivide do
writeln('Khong the chia cho 0');
on E: Exception do
writeln('Loi khac: ', E.Message);
end;
end;
Khi chạy chương trình bằng phím F9 (run with debugger), chương trình sẽ tạm dừng và thông báo như sau sẽ hiển thị với các thông tin như tên lỗi, địa chỉ lỗi. Khi bạn nhấn Continue chương trình sẽ tiếp tục với dòng Khong the chia cho 0 được in ra.
Từ khóa raise ném ra một lỗi cho debugger, bắt buộc đặt sau khối do của exception.
on E: Exception do
begin
Writeln('Co loi !');
raise E.Create('Loi khong xac dinh');
end;
Nói chung phần raise này khá khó hiểu, nôm na là thông báo cho trình gỡ lỗi (debugger) biết cụ thể về lỗi, chứ để mặc định lỗi sẽ tự động raise một thông báo khó hiểu, dùng cú pháp raise để tạo ra thông báo tùy chỉnh dễ hiểu hơn.