Tải bản đầy đủ (.pptx) (17 trang)

Ngôn ngữ lập trình C++_Chuong7_KiemSoatLoi ppsx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (265.18 KB, 17 trang )

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ả ử ậ ỗ ử ỗ


3Chương 7: Kiểm soát ngoại lệĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH
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ả ệ ử ỗ
4Chương 7: Kiểm soát ngoại lệĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH
1. Giới thiệu
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++
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


Đ 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ọ ử ụ
7Chươ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

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ặ ớ ứ ố ượ ử
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;
}
8Chươ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

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

}

}
9Chươ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ệ
#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;

}
}
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

b=4
c=1
He so a = 0
Da co loi he so
11Chươ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ệ
#include <iostream>
#include <math.h>
using namespace std;
//Lớp xử lý ngoại lệ
class Exception {
public:
Exception(){
cout<<"He so a = 0"<<endl;
}
Exception(float delta){
cout<< “Delta am =“ <<
delta<<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 Exception();
float d = b*b - 4*a*c;
if (d<0) throw Exception(d);
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;
}
}
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

Delta am =-39
Da co loi!

Nhap cac he so:
a=0
b=1
c=2
He so a = 0
Da co loi!
13Chương 7: Kiểm soát ngoại lệĐHBK Hà Nội - Khoa ĐTVT - Bộ môn ĐTTH
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 trình s g i ướ ế ươ ẽ ọ
hàm
f
.

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

×