260 likes | 395 Views
Gỡ rối – Xử lý lỗi – Ngoại lệ. Nhóm 10. 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. Tầm quan trọng của gỡ lỗi. BEGIN. Syntax error. Compile. Hiện thực. Bài toán. Code. No Syntax error. Wrong result. Run.
E N D
Gỡ rối – Xử lý lỗi – Ngoại lệ Nhóm 10
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
Tầm quan trọng của gỡ lỗi BEGIN Syntax error Compile Hiện thực Bài toán Code No Syntax error Wrong result Run END Correct result Chương trình ? Run-time error ( Exception )
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.
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
Assertion làgì • Địnhnghĩa: Assertion làmộtđoạn code chophép 1 chươngtrìnhtựkiểmtrachínhnótrongquátrìnhthựcthi. Nếugiátrịcủa assertion là true chươngtrìnhhoạtđộngđúng , nếu false làpháthiệnlỗitrongchươngtrình. • Lậptrìnhviênsửdụng assertion đểmôtảcáchthứccácđoạn code hoạtđộngnhưthếnào, chứngthựccácràngbuộcbêntronghệthống.
Một assertion thườngnhận 2 đốisố: 1 biểuthứcluậnlýkếtquảtrảvềlà true hoặc false chobiếtchươngtrìnhchạysai hay đúng. Mộtđốisốlà 1 messages thôngbáocholậptrìnhviênbiếtlỗicủachươngtrìnhnếukếtquảlà false. VD: trong java dùng assertion nhưsau: Assert 0 <= index && index < length : “ Out of memory”; • Trong C++ cungcấp macro “ assert” tươngtựnhưhàmnhưngkhôngcóthamsố message thôngbáolỗi. Vd: assert(0 <= index && index < length);
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.
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ó.
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.
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
Đị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 XỬ LÝ NGOẠI LỆ (Exception Handle)
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
XỬ LÝ NGOẠI LỆ(Exception Handle) Cấu trúc: try { } catch(Exception e1) { } catch(Exception e2) { } catch(Exception eN) { } Finally { }
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ệ
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
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(); }
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) { } // of the inner try block } catch(Exception e) { } // of the outer try block
XỬ LÝ NGOẠI LỆ(Exception Handle) public class Example { public void exceptionExample() throws Exexception, LookupException { try { //statement } catch(ExException exmp) { } catch(LokkupException lkpex) { } } }
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(); }
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 } }
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ệ
XỬ LÝ NGOẠI LỆ(Exception Handle) Danh sách một số Exception trong Java: • RuntimeException • ArthmeticException • IIIegalAccessException • IIIegalArgumentException • ArrayIndexOutOfBoundsException • NullPointerException • SecurityException • ClassNotFoundException • NumberFormatException • AWTException • IOException • FileNotFoundException • EOFException • NoSuchMethodException • InterruptedException
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
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ý