Xử lý lỗi - Ngoại lệ - xaydungphanmem

download report

Transcript Xử lý lỗi - Ngoại lệ - xaydungphanmem

Gỡ rối – Xử lý lỗi – Ngoại lệ
Nhóm 10
1
Nội dung
•
•
•
•
•
•
Tầm quan trọng của gỡ lỗi.
Xác nhận (assertions)
Xử lý lỗi
Xử lý ngoại lệ
Xử lý rào chắn
Các công cụ sửa lỗi
2
Tầm quan trọng của gỡ lỗi
Syntax error
BEGIN
Bài toán
Hiện
thực
Code
No
Syntax error
Wrong result
END
?
Correct result
Compile
Run
Chương trình
Run-time error
( Exception )
Slide 3/41
Các loại lỗi của chương trình
• Compile-time error = Syntax error
• Run-time error = Exception, tình huống bất bình
thường đã xẩy ra trong khi chương trình thực thi.
• Khi có Exception:
– Có thể là máy bị treo (halt).
– Chương trình ngắt đột ngột, điều khiển trả về cho OS, OS
thu hồi bộ nhớ của chương trình ( đuổi ra ngoài ).
• Cần có cơ chế điều khiển tình huống này.
4
Tầm quan trọng của gỡ lỗi
• Tránh các lỗi đáng tiếc xảy ra.
• Giảm bớt hậu quả thiệt hại về lỗi
5
Assertion là gì
• Định nghĩa: Assertion là một đoạn code cho phép 1 chương
trình tự kiểm tra chính nó trong quá trình thực thi. Nếu giá trị
của assertion là true chương trình hoạt động đúng , nếu false
là phát hiện lỗi trong chương trình.
• Lập trình viên sử dụng assertion để mô tả cách thức các đoạn
code hoạt động như thế nào, chứng thực các ràng buộc bên
trong hệ thống.
6
Một assertion thường nhận 2 đối số: 1 biểu thức luận lý kết quả
trả về là true hoặc false cho biết chương trình chạy sai hay đúng.
Một đối số là 1 messages thông báo cho lập trình viên biết lỗi
của chương trình nếu kết quả là false.
VD: trong java dùng assertion như sau:
Assert 0 <= index && index < length : “ Out of memory”;
• Trong C++ cung cấp macro “ assert” tương tự như hàm nhưng
không có tham số message thông báo lỗi.
Vd: assert(0 <= index && index < length);
7
Xử lý các assertion bị thất bại
• Khi assertion bị thất bại, đầu tiên là nó sẽ truyền thông
báo lỗi đến người dùng bằng nhiều cách (in ra màn hình,
message box, file log...). Khi các thông báo chuẩn đoán
được hiển thị. Có nhiều cách chọn lựa tiếp theo:
–
–
–
–
Kết thúc chương trình
Cho phép thực thi tiếp chương trình
Quăng một ngoại lệ quay về đoạn code bị lỗi.
Cho phép kết hợp 1 hay nhiều cách trên.
8
Lợi ích của assertions
• Vai trò của các assertion là xác định lỗi trong chương
trình.
• Một lợi ích lớn nữa là giúp việc kiểm thử ứng dụng được
hiệu quả hơn.
• Tuy nhiên assertion chỉ có hiệu quả khi được thực thi
trong đoạn mã nguồn chứa nó.
9
Giới hạn của assertions
• Bản thân 1 assertion cũng có thể tồn tại các lỗi và do 1
trong các nguyên nhân sau:
– Thông báo lỗi không có thực.
– Không thực hiện được 1 báo cáo lỗi tồn tại trong chương trình
– Not being side-effect free
Assertion có thể tác động đến hiệu năng cùa chương trình:
 Chiếm nhiều thời gian thực thi
 Nắm giữ vùng nhớ
Các assertion có thể làm cho việc kiểm thử chương trình khó
khăn hơn.
10
Xử lý lỗi
• Neutral value (giá trị trung lập)
• Substitute the next piece of valid data (thay thế phần kế tiếp của dữ liệu
hợp lệ)
• Return the same answer as the previous time (trả về kết quả giống nhau
như thời gian trước)
• Substitute the closet legal value (thay thế giá trị hợp lệ gần đúng nhất)
• Log a warning message to a file (gửi thông điệp cảnh báo đến 1 file)
• Return an error code (trả về 1 lỗi code)
• Call an error processing routine/object (gọi 1 đối tượng/routine xử lý lỗi)
• Display an error message wherever the error is encountered (hiển thị
thông báo lỗi bất cứ khi nào 1 lỗi được gặp phải).
• Handle the error in whatever way works best locally (xử lý các lỗi trong bất
cứ cách nào hoạt động tốt nhất tại nội bộ)
• shutdown
11
XỬ LÝ NGOẠI LỆ (Exception Handle)
Định nghĩa:
- Là một lỗi đặc biệt( chia cho 0, vượt kích thước mảng, mở file chưa tồn tại… )
- Xuất hiện lúc thực thi chương trình
- Tạo ra các excception, các trạng thái này không được biết trước khi đang xây
dựng chương trình
- Có thể bị kết thúc đột ngột
- Các ngôn ngữ lập trình mạnh về xử lý ngoại lệ: Java, C#,…
Mục đích:
- Chương trình không bị ngắt đột ngột
- Tránh lãng phí tài nguyên
12
XỬ LÝ NGOẠI lỆ
(Exception Handle)
Mô hình xử lý ngoại lệ trong Java:
-
catch & throw. 5 từ khóa để xử lý ngoại lệ:
• Try
• Catch
• Throw
• Throws
• Finally
13
XỬ LÝ NGOẠI LỆ
(Exception Handle)
Cấu trúc:
try { }
catch(Exception e1) { }
catch(Exception e2) { }
catch(Exception eN) { }
Finally { }
14
XỬ LÝ NGOẠI LỆ
(Exception Handle)
Ưu điểm:
- Phân phối trạng thái lỗi chỉ vào những nơi cần
thiết
- Một thông báo lỗi có thể được xuất ra khi tiến
hành xử lý ngoại lệ
15
Bẫy lỗi bằng try...catch...finally
• Để chương trình
vẫn có thể tiếp
tục hoạt động,
người lập trình
cần phải dự đoán
lỗi có thể xẩy ra
để bẫy lỗi.
• Bẫy lỗi bằng cú
pháp: try...catch
...finally ...
try
{ < các lệnh thử làm>
}
catch ( Exception1 e1)
{ < code xử lý lỗi>
}
catch ( Exception2 e2)
{ < code xử lý lỗi>
}
finally
{ <các lệnh sẽ làm dù có lỗi hay không>
}
// Buộc phải có {...} dù chỉ có 1 phát biểu
Slide 16/41
XỬ LÝ NGOẠI LỆ
(Exception Handle)
Khối ‘try’ và ‘catch’
- Thi hành mô hình ‘catch và throw’
- Một hay nhiều khối ‘catch’ có thể theo sau khối ‘try’
- Các khối ‘catch’ bắt các ngoại lệ bị chặn trong khối ‘try’
Ví dụ:
try{
doFileProcessing(); //user-defined method
displayResults();
}
Catch(Exception e) {
System.err.println(“Error:” + e.toString());
e.printStackTrace();
}
17
XỬ LÝ NGOẠI LỆ
(Exception Handle)
Các khối ‘try’ lồng nhau:
try
{
statement 1;
statement 2;
try
{
statement 1;
statement 2;
}
catch(Exception e) { }
}
catch(Exception e) { }
// of the inner try block
// of the outer try block
18
XỬ LÝ NGOẠI LỆ
(Exception Handle)
public class Example
{
public void exceptionExample() throws Exexception, LookupException
{
try
{
//statement
}
catch(ExException exmp) { }
catch(LokkupException lkpex) { }
}
}
19
XỬ LÝ NGOẠI LỆ
(Exception Handle)
Khối finally
- Thực hiện thu hồi tài nguyên khi một ngoại lệ xảy ra
- Sử dụng kết hợp với khối ‘try’
try
{
doSomethingThatMightThrowAnException();
}
finally
{
cleanup();
}
20
21
XỬ LÝ NGOẠI LỆ
(Exception Handle)
throw & throws
• throw
- ‘throw’ chỉ ra một ngoại lệ vừa xảy ra, là một đối tượng của
lớp dẫn xuất từ ‘throwable’
try
{
if(flag < 0)
{
throw new MyException();
// user-defined
}
}
22
XỬ LÝ NGOẠI LỆ
(Exception Handle)
throw & throws(tt)
• throws
- Áp dụng cho một phương thức để xử lý nhiều
ngoại lệ
23
XỬ LÝ NGOẠI LỆ
(Exception Handle)
Danh sách một số Exception trong Java:
•
•
•
•
•
RuntimeException
ArthmeticException
IIIegalAccessException
IIIegalArgumentException
ArrayIndexOutOfBoundsExcepti
on
• NullPointerException
• SecurityException
•
•
•
•
•
•
•
•
ClassNotFoundException
NumberFormatException
AWTException
IOException
FileNotFoundException
EOFException
NoSuchMethodException
InterruptedException
24
XỬ LÝ NGOẠI LỆ
(Exception Handle)
Tóm tắt
• Bất cứ khi nào một lỗi xuất hiện trong khi thi hành chương trình, nghĩa là
một ngoại lễ đã xuất hiện
• Ngoại lệ phát sinh vào lúc thực thi chương trình theo trình tự code
• Mỗi ngoại lệ phát sinh phải bị bắt giữ, nếu không ứng dụng sẽ bị ngắt
• Cho phép kết hợp tất cả tiến trình xử lý lỗi trong một nơi
• Các câu lệnh trong khối ‘try’ chặn ngoại lệ, khối ‘catch’ xử lý ngoại lệ
• Nhiều khối catch có thể được sử dụng với các kiểu ngoại lệ khác nhau theo
các cách khác nhau
• ‘throws’ liệt kê các ngoại lệ mà phương thức có thể chặn được
• ‘throw’ chỉ ra 1 ngoại lệ vừa xảy ra
• ‘finally’ khai báo các cấu lệnh thu hồi tài nguyên cho hệ hống và xuất câu
thông báo
25
RÀO CHẮN
• Xử lý trước khi xảy ra lỗi.
VD: if( num != 0) return a/num;
• Xử lý giao diện hợp lý
26