Phần 2: Ngôn ngữ lập trình
C++
Ch ng 7: ươ
C ch ki m soá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ệ ạ ệ
2Chương 7: Kiểm soát ngoại lệĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH
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ả ử ậ ỗ ử ỗ
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++
5Chương 7: Kiểm soát ngoại lệĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH
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
6Chương 7: Kiểm soát ngoại lệĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH
2. Cơ chế bẫy và bắt lỗi
•
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ử ạ ệ ợ
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
}
}
10Chương 7: Kiểm soát ngoại lệĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH
Ví dụ 1: hàm có 1 ngoại lệ (tiếp)
int main(int argc, char **argv)
{
float a,b,c;
cout<<"Nhap cac he so:"<<endl;
cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
cout<<"c=";cin>>c;
float x1,x2;
try {
int n = PTB2(a,b,c,x1,x2);
cout<<"So nghiem cua PT:"<<n;
}
catch (Loi_He_So_A){
cout<<"Da co loi he so";
}
return 0;
}
Kết quả chạy:
Nhap cac he so:
a=4
b=4
c=1
So nghiem cua PT:1
Nhap cac he so:
a=0
} else {
x1= (-b-sqrt(d))/2/a;
x2= (-b+sqrt(d))/2/a;
return 2;
}
}
12Chương 7: Kiểm soát ngoại lệĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH
Ví dụ 2: hàm có 2 ngoại lệ (tiếp)
int main(int argc, char **argv)
{
float a,b,c;
cout<<"Nhap cac he so:"<<endl;
cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
cout<<"c=";cin>>c;
float x1,x2;
try {
int n = PTB2(a,b,c,x1,x2);
cout<<"So nghiem cua PT:"<<n;
}
catch (Exception){
cout<<"Da co loi!";
}
return 0;
}
Kết quả chạy:
Nhap cac he so:
a=5
b=1
c=2
14Chương 7: Kiểm soát ngoại lệĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH
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 .ệ ạ ệ
15Chương 7: Kiểm soát ngoại lệĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH
Bài tập
•
Bài 1: M r ng các bài t p v danh sách ở ộ ậ ề
trong ch ng 9, b ng cách đ a thêm 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ổ ộ ầ ử ầ
16Chương 7: Kiểm soát ngoại lệĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH
Xin cảm ơn!
17Chương 7: Kiểm soát ngoại lệĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH