Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 17 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
17
Dung lượng
560,68 KB
Nội dung
Phần 2: Ngôn ngữ lập trình C++
Chương 7:
Cơ chế kiểmsoát và xử lý các ngoại lệ
Các nội dung chính
1. Giới thiệu
2. Cơ chế bẫy và bắt ngoại lệ
3. Hoạt động của chương trình khi xuất hiện
ngoại lệ
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểmsoát ngoại lệ 2
1. Giới thiệu
• Các loại lỗi trong chương trình
– Lỗi cú pháp (syntax errors)
– Lỗi chạy (runtime errors):
• Sai giải thuật
• Không tính hết các khả năng của bài toán
• Hiểu sai hoặc không đầy đủ các lệnh
• Các giải pháp khắc phục
– Giải pháp phòng chống: cung cấp các cơ chế hạn chế
khả năng xuất hiện soát lỗi, hoặc đơn giản hóa việc xử
lý khi có lỗi xảy ra
– Giải pháp xử lý: tìm và cô lập lỗi, sửa lỗi
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểmsoát ngoại lệ 3
1. Giới thiệu
• Xử lý lỗi trong C: chưa có các biện pháp phòng
chống cũng như đơn giản hóa việc xử lý lỗi.
Hoàn toàn phụ thuộc vào người lập trình
người lập trình phải gánh thêm trách nhiệm
xử lý lỗi.
• Xử lý lỗi trong C++: đưa vào cơ chế “bẫy và
bắt lỗi” (try throw catch) nhằm tăng
cường khả năng cũng như đơn giản hóa việc
xử lý lỗi
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểmsoát ngoại lệ 4
1. Giới thiệu
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểmsoát ngoại lệ 5
int main () {
if (doing something OK){
Chạy trường hợp bình thường
}
else { //Trường hợp có lỗi
Xử lý lỗi
}
…
}
int main () {
try {
Chạy như trường hợp
bình thường;
Nếu có lỗi thì nó sẽ tự động
bị ném (throw) sang
nhánh catch;
}
catch { //Trường hợp bắt lỗi
Gọi thao tác xử lý
lỗi mặc định
Xử lý thêm nếu cần
}
…
}
Xử lý lỗi trong C Xử lý lỗi trong C++
2. Cơ chế bẫy và bắt lỗi
• Giới thiệu cơ chế:
– Nhằm xử lý các ngoại lệ (exception): là các trường
hợp đặc biệt mà có thể cần các xử lý riêng
– Các ngoại lệ này thường được giao cho một số lớp
hay đối tượng chuyên dụng xử lý
– Gồm có 3 phần: try – throw – catch
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểmsoát ngoại lệ 6
2. Cơ chế bẫy và bắt lỗi
• Đối với mỗi hàm có chứa các ngoại lệ, cơ chế
này có 2 giai đoạn:
– Khi cài đặt hàm
– Khi gọi sử dụng hàm
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểmsoát ngoại lệ 7
2. Cơ chế bẫy và bắt lỗi
• Khi cài đặt hàm
– Đầu tiên, phải xác định các
trường hợp có ngoại lệ, từ
đó xác định đối tượng sẽ xử
lý các ngoại lệ đó (một hàm
có thể yêu cầu một hoặc
nhiều đối tượng xử lý các
ngoại lệ)
– Sau đó với mỗi trường hợp
ngoại lệ, dùng lệnh throw để
ném trường hợp đó cho một
đối tượng để xử lý
– Cài đặt lớp mà chứa đối
tượng xử lý trên
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểmsoát ngoại lệ 8
void f_except(){
if (OK) { Trường hợp bình
thường}
else
if (except1) throw obj_exc1;
else
if (except2) throw obj_exc2;
}
2. Cơ chế bẫy và bắt lỗi
• Khi gọi sử dụng hàm:
– Đặt lời gọi hàm này
trong khối lệnh try
– Khối lệnh try này hoạt
động theo nguyên tắc:
• Nếu không gặp ngoại lệ
nào thì nó hoạt động
bình thường
• Nếu gặp một ngoại lệ thì
nó tự động dừng lệnh
này tại điểm gặp ngoại lệ,
rồi chuyển đến khối lệnh
catch mà chứa đối tượng
xử lý ngoại lệ phù hợp
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểmsoát ngoại lệ 9
int main () {
try {
f_except();
/*Hàm này có chứa các exception cần xử
lý. Nếu có gặp các exception trên thì nó
sẽ tự động bị ném (throw) cho đối tượng
xử lý các exception nằm ở nhánh catch*/
}
catch { //Trường hợp bắt lỗi
Gọi thao tác xử lý
lỗi mặc định
Xử lý thêm nếu cần
}
…
}
Ví dụ 1: hàm có 1 ngoại lệ
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểmsoát ngoại lệ 10
#include <iostream>
#include <math.h>
using namespace std;
//Lớp xử lý ngoại lệ
class Loi_He_So_A {
public:
Loi_He_So_A(){
cout<<"He so a = 0"<<endl;
}
};
int PTB2(float a, float b, float c,
float &x1,float &x2) {
//Có ngoại lệ, ném nó cho lớp
xử lý ngoại lệ
if (a==0) throw Loi_He_So_A();
float d = b*b - 4*a*c;
if (d<0) return 0;
else if (d==0) {
x1=x2=-b/2/a;
return 1;
} else {
x1= (-b-sqrt(d))/2/a;
x2= (-b+sqrt(d))/2/a;
return 2;
}
}
[...]... ĐTTH Chương 7: Kiểm soát ngoại lệ 14 Ví dụ • Chạy lại 2 ví dụ trên, nhưng bây giờ không đặt lời gọi hàm PTB2 trong khối lệnh try, đồng thời định nghĩa thêm 1 hàm để đặt trong câu lệnh set_terminate để hiểu thêm về cơ chế hoạt động của chương trình khi xuất hiện ngoại lệ ĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH Chương 7: Kiểm soát ngoại lệ 15 Bài tập • Bài 1: Mở rộng các bài tập về danh sách trong chương. .. vào các xử lý ngoại lệ: – Lấy ra một phần tử từ danh sách đã rỗng – Bổ sung một phần tử vào danh sách đã đầy ĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH Chương 7: Kiểm soát ngoại lệ 16 Xin cảm ơn! ĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH Chương 7: Kiểm soát ngoại lệ 17 ... co loi! Chương 7: Kiểm soát ngoại lệ 13 3 Hoạt động của chương trình khi xuất hiện ngoại lệ • Khi gọi một hàm mà có xuất hiện ngoại lệ, có 1 trong 2 khả năng xảy ra: – Nếu hàm đó được đặt trong khối lệnh bắt ngoại lệ try, thì ngoại lệ đó sẽ bị bắt và chuyển cho đối tượng xử lý ngoại lệ đó – Trái lại, chương trình sẽ kết thúc bất thường Nếu có câu lệnh set_terminate(f) thì trước khi kết thúc, chương. .. ngoại lệ if (a==0) throw Exception(); float d = b*b - 4*a*c; if (d