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

Chương 7 Kiểm soát lỗi C++

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 (560.68 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ệ
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểm soá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ểm soá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ểm soát ngoại lệ 4
1. Giới thiệu
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểm soá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ểm soá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ểm soá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ểm soá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ểm soá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ểm soá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;
}
}
Ví dụ 1: hàm có 1 ngoại lệ (tiếp)
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểm soát ngoại lệ 11
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
Ví dụ 2: hàm có 2 ngoại lệ
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểm soát ngoại lệ 12
#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;
}
}
Ví dụ 2: hàm có 2 ngoại lệ (tiếp)
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn ĐTTH
Chương 7: Kiểm soát ngoại lệ 13
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!

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.
ĐHBK Hà Nội - Khoa ĐTVT - Bộ
môn Đ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 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
Đ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

×