Ngoại lệ Exception: sự kiện không mong muốn xảy ra trong khi thực hiện chương trình Nếu ngoại lệ xảy ra trong khi thực hiện Người lập trình cung cấp mã để kết thúc chương trình hoặ
Trang 1Lập trình hướng đối tượng
Bài 7: Ngoại lệ (Exception)
Trang 3Ngoại lệ
Exception: sự kiện không mong muốn xảy ra
trong khi thực hiện chương trình
Nếu ngoại lệ xảy ra trong khi thực hiện
Người lập trình cung cấp mã để kết thúc chương
trình hoặc
Chương trình kết thúc với thông báo lỗi thích hợp
Có thể bổ sung thêm mã quản lý ngoại lệ ở nơi
Trang 4Quản lý ngoại lệ trong chương trình
Hàm assert:
Kiểm tra nếu biểu thức thỏa điều kiện nào đó
Nếu điều kiện không được thỏa, nó kết thúc chương trình
Thí dụ: chia cho 0
Nếu số chia là 0, assert kết thúc chương trình với thông báo lỗi
Trang 5Cơ chế của C++ để quản lý lỗi
Sử dụng khối try/catch
Ngoại lệ phải được ném ra từ trong khối try
và sẽ bị bắt trong khối catch
C++ cung cấp sự hỗ trợ việc quản lý ngoại lệ thông qua cây phân cấp các lớp
Trang 6Khối try/catch
Các lệnh có thể phát sinh ngoại lệ được đặt
trong khối try
Khối try cũng chứa các lệnh mà sẽ không được thực hiện nếu ngoại lệ xảy ra
Mỗi khối try có thể có 1 hoặc nhiều khối catch
Trang 7Khối try/catch
Khối catch:
Xác định dạng ngoại lệ mà nó bắt
Chứa lệnh xử lý ngoại lệ
Nếu khối catch chứa trong phần tham số
Khối catch có thể bắt tất cả các dạng ngoại lệ
Trang 8 Cú pháp chung của khối try/catch
Trang 9Khối try/catch
Nếu không có ngoại lệ được ném ra từ khối try
Tất cả các khối catch cho khối try đó bị lờ đi
Việc thực hiện sẽ tiếp tục với lệnh sau khối catch sau cùng
Nếu ngoại lệ được ném ra từ khối try
Trang 10Khối try/catch
Chương trình chuyển tới các khối catch theo thứ
tự tìm kiếm quản lý ngoại lệ tương ứng
Nếu dạng ngoại lệ ném ra phù hợp với dạng
tham số trong một khối catch nào đó:
Mã của khối catch đó được thực hiện
Các khối catch còn lại không được thực hiện
Trang 13Ném ra ngoại lệ:
Trang 14Thứ tự của các khối catch
Trang 15Khối try/catch trong chương trình:
Trang 16 Lớp cơ sở cho các lớp ngoại lệ của C++
Chứa trong head file exception
Trang 18Sử dụng các lớp ngoại lệ trong C++
Lớp out_of_range giải quyết với chuỗi ngoài giới hạn (subscript out_of_range)
Lớp length_error giữ các lỗi nếu
Chiều dài lớn hơn độ dài lớn nhất cho phép
Trang 19 Nếu toán tử new không thể cung cấp bộ nhớ
Trang 20Lớp ngoại lệ người dùng
Người lập trình có thể tạo lớp ngoại lệ mới
C++ sử dụng cùng một cơ chế cho các ngoại lệ người dùng xác định và ngoại lệ có sẵn
Phải ném ra các ngoại lệ người dùng xác định qua lệnh throw
Mọi lớp đều có thể là lớp ngoại lệ
Trang 21Ném ra và ném tiếp ngoại lệ
Khi ngoại lệ xảy ra trong khối try
Điều khiển ngay lập tức được chuyển tới khối catch
Trong khối catch
Quản lý ngoại lệ hoặc xử lý cụ thể ngoại lệ và sau
đó ném tiếp ngoại lệ, hoặc
Ném ngoại lệ khác cho môi trường
Trang 22 Cú pháp chung để ném tiếp ngoại lệ là:
Trang 23 Đối tượng được ném ra có thể là
Đối tượng cụ thể
Đối tượng nặc danh
Hàm xác định các ngoại lệ nó ném ra trong khai báo sử dụng mệnh đề throw
Ném ra và ném tiếp ngoại lệ
Trang 24Các kỹ thuật quản lý ngoại lệ
Khi ngoại lệ xảy ra người lập trình thường có
Trang 25 Không thể tiếp tục thực hiện chương trình
Chương trình có thể đưa ra thông báo lỗi tương ứng và kết thúc
Trang 26Sửa lỗi và tiếp tục
Trong một số trường hợp, người lập trình muốn sửa lỗi
và tiếp tục chương trình
Thí dụ, nếu người dùng vào chữ cái trong phần số
Kênh vào sẽ chuyển sang trạng thái failt
Cần thêm một số mã để giữ dấu nhắc người dùng vào tới khi dữ liệu vào hợp lệ
Trang 27Log và tiếp tục chương trình
Thí dụ, nếu chương trình được thiết kế để điều khiển phản ứng hạt nhân hoặc theo dõi vệ tinh
Không thể kết thúc nếu có ngoại lệ xảy ra
Khi ngoại lệ xảy ra
Chương trình nên viết ngoại lệ ra và tiếp tục chạy
Trang 28Xem xét stack ngoại lệ
Khi ngoại lệ được ném ra trong hàm, hàm có thể như sau:
Không làm gì
Xử lý một phần ngoại lệ rồi ném tiếp ra ngoài
Ném ra ngoại lệ mới
Trang 29 Trong các trường hợp này stack ngoại lệ của
hàm gọi được cởi ra
Ngoại lệ có thể được bắt ở khối try/catch tiếp theo
Khi stack hàm gọi được cởi ra
Hàm ở đó ngoại lệ không được bắt hoặc được ném tiếp sẽ kết thúc
Xem xét stack ngoại lệ
Trang 30 Stack được cởi ra tới khi
Có khối try/catch quản lý ngoại lệ
Chương trình không quản lý ngoại lệ
Nếu chương trình không quản lý ngoại lệ, hàm
terminate được gọi để kết thúc chương trình
Xem xét stack ngoại lệ
Trang 31 Khối try/catch quản lý ngoại lệ
Các lệnh trong khối try có thể phát ra ngoại lệ
Khối catch xác định dạng ngoại lệ nó có thể bắt và chứa
mã giải quyết
Trang 32Tổng kết
Nếu không xảy ra ngoại lệ nào, tất cả các khối catch cho khối try đó được lờ đi, lệnh tiếp tục thực hiện sau khối catch sau cùng
Dạng dữ liệu của tham số khối catch xác định dạng ngoại lệ khối catch đó bắt
Khối catch chỉ có thể có nhiều nhất 1 tham số
Lớp exception là lớp cơ sở cho các lớp ngoại lệ khác
Dữ liệu thành phần tên what trả ra chuỗi chứa bởi đối
tượng ngoại lệ ném ra bởi các lớp ngoại lệ built-in
Trang 33Tổng kết
Lớp exception nằm trong file header exception
Lớp runtime_error giữ lỗi thời gian chạy
C++ cho phép người lập trình tạo lớp ngoại lệ của họ
Hàm xác định các ngoại lệ nó ném ra ở khai báo cảu nó
sử dụng từ khóa throw
Nếu chương trình không bắt ngoại lệ thì hàm terminate
kết thúc chương trình