xỬ lÝ ngoẠi lỆfit.huflit.edu.vn/wp-content/uploads/2017/08/chuong-09.xu-ly-ngoai-le.pdf ·...

32
Click to edit Master subtitle style XỬ LÝ NGOẠI LỆ Khoa Công nghệ thông tin Trường Đại học Ngoại ngữ - Tin học, TP.HCM CHƯƠNG 9: 1

Upload: others

Post on 28-Feb-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Click to edit Master subtitle style

XỬ LÝ NGOẠI LỆ

Khoa Công nghệ thông tin Trường Đại học Ngoại ngữ - Tin học, TP.HCM

CHƯƠNG 9:

1

Khái niệm ngoại lệ (exception) Cơ chế hoạt động của Exception handling Bắt exception (catching exception)

Cấu trúc khối lệnh try – catch Cấu trúc khối lệnh có nhiều mệnh đề catch

Ném ngoại lệ (Throwing exception) Từ khóa finally Tóm tắt

NỘI DUNG

2

KHÁI NIỆM NGOẠI LỆ (EXCEPTION)

Ngoại lệ (exception) là đối tượng chứa các thông tin về lỗi (error condition) hoặc các sự cố bất thường (unexpected behavior) khi thực thi chương trình. Ngoại lệ xuất phát từ:

Lỗi trong code lập trình Lỗi gây ra bởi người dùng (người dùng nhập một con số thay vì phải nhập các ký tự chữ cái,…) Lỗi từ hệ điều hành (hết tài nguyên bộ nhớ, …)

Khái niệm ngoại lệ (exception)

4

Ví dụ:

Khái niệm ngoại lệ (exception)

5

public int GetNumber(int min, int max) { int number=0; while (number < min || number>max) { Console.Write(“Enter a number between {0} and {1}: ”, min, max); string input = Console.ReadLine(); number = Convert.ToInt32(input); } return number; }

Người dùng nhập vào một

số nguyên ?

Ví dụ:

Khái niệm ngoại lệ (exception)

6

public int GetNumber(int min, int max) { int number=0; while (number < min || number>max) { Console.Write(“Enter a number between {0} and {1}: ”, min, max); string input = Console.ReadLine(); number = Convert.ToInt32(input); } return number; }

Người dùng nhập vào các ký tự: asdf ?

Lỗi (exception) Xử lý lỗi như thế nào?

Trình quản lý ngoại lệ (Exception handling): là cơ chế của C# để bắt những lỗi khi chương trình đang thực thi

Khái niệm ngoại lệ (exception)

7

CƠ CHẾ HOẠT ĐỘNG CỦA EXCEPTION HANDLING

Cơ chế hoạt động của Exception handling

9

Lỗi xuất hiện

Tạo đối tượng

exception chứa thông

tin lỗi

Ném (throw)

exception

Bắt (catch) và xử lý lỗi

Ném đối tượng exception này đến phương thức gọi nó, phần code sau đó không được thực thi.

Phương thức biết cách xử lý thì bắt exception này (catch)

BẮT EXCEPTION (CATCHING EXCEPTION)

Trước khi bắt exception, chúng ta phải biết Xác định lỗi sẽ xuất hiện tại lệnh nào

• Đưa đoạn code sẽ gây ra lỗi (exception) vào trong khối lệnh try

Chúng ta sẽ làm gì với lỗi đó • Lệnh bắt (catch) và xử lý lỗi trong khối lệnh catch

Bắt exception (catching exception)

11

Ví dụ:

Bắt exception (catching exception)

12

public int GetNumber(int min, int max) { int number=0; while (number < min || number>max) { Console.Write(“Enter a number between {0} and {1}: ”, min,max); string input = Console.ReadLine(); number = Convert.ToInt32(input); } return number; }

Đoạn code có thể gây ra lỗi (exception)

Bắt exception (catching exception) public int GetNumber(int min, int max) { int number=0; while (number < min || number>max) { try { Console.Write(“Enter a number between {0} and {1}: ”, min, max); string input = Console.ReadLine(); number = Convert.ToInt32(input); } catch (Exception e) { Console.WriteLine(“This is not a valid number. Try again.”); } } }

13

Xử lý lỗi không khối lệnh catch

Đưa đoạn code có thể

gây ra lỗi vào khối lệnh try

Cấu trúc khối lệnh try – catch Cấu trúc khối lệnh có nhiều mệnh đề catch

Bắt exception (catching exception)

14

Cấu trúc khối lệnh try – catch Cấu trúc khối lệnh có nhiều mệnh đề catch

Bắt exception (catching exception)

15

Giải thích Khối try chứa đoạn mã có thể sinh lỗi Khối catch: Xác định exception và làm sao xử lý lỗi Thông tin lỗi: Nằm trong đối tượng tên e (nếu chúng ta không dùng e thì có thể bỏ)

Cấu trúc khối lệnh try - catch

try { } catch (Exception e) { }

16

Thuộc tính của lớp Exception Message : mô tả lỗi Source : get/set nguồn gây ra lỗi (từ thư viện lỗi) StackTrace : Tra cứu nguồn gốc gây ra lỗi TargetSite: phương thức gây ra lỗi

Cấu trúc khối lệnh try - catch

17

Cấu trúc khối lệnh try – catch Cấu trúc khối lệnh có nhiều mệnh đề catch

Bắt exception (catching exception)

18

Bắt nhiều exception khác nhau

Cấu trúc khối lệnh có nhiều mệnh đề catch

try { string input = “a”; int number = Convert.ToInt32(input) } catch (FormatException e) { Console.WriteLine(“You must enter a number.”); } catch (OverflowException e) { Console.WriteLine(“Enter a smaller number.”); } catch (Exception e) { Console.WriteLine(“An unknown error occurred.”); }

19

Ghi chú: Khi một khối lệnh catch được thực thi, nó sẽ bỏ qua các khối lệnh catch còn lại Thứ tự các khối lệnh catch rất quan trọng

• Các kiểu ngoại lệ cụ thể (các lớp dẫn xuất) phải xếp trước các kiểu ngoại lệ tổng quát (lớp cơ sở)

Câu lệnh sẽ ra sao nếu khối lệnh catch (Exception e) xếp trước catch (FormatException e) và catch (OverflowException e) ?

Cấu trúc khối lệnh có nhiều mệnh đề catch

20

NÉM NGOẠI LỆ (THROWING EXCEPTION)

Để báo hiệu một tình huống bất thường trong một lớp của C# ném ra một ngoại lệ bằng cách dùng từ khoá throw Cú pháp:

throw [expression]; expression : là một đối tượng ngoại lệ được dẫn

xuất từ System.Exception

Ném ngoại lệ (Throwing exception)

22

Ví dụ:

Ném ngoại lệ (Throwing exception)

public void Something() { throw new Exception(“thông tin lỗi”); }

23

Giải thích Câu lệnh throw giống câu lệnh return, nhưng ném exception thay vì trả về một giá trị Hoạt động:

• Tạo ra một đối tượng exception (giống đối tượng khác) bằng từ khóa new

• Ném đối tượng này

Ném ngoại lệ (Throwing exception)

24

Ngoài ra, còn có một số lớp exception khác NotImplementedException IndexOutOfRangeException InvalidCastException FormatException NotSupportedException NullReferenceException StackOverflowException DivideByZeroException ArgumentNullException ArgumentOutOfRangeException …

Ném ngoại lệ (Throwing exception)

25

Ví dụ

Ném ngoại lệ (Throwing exception)

26

public void TestFunction() { try { double a = 5; double b = 0; Console.WriteLine("{0} /{1} = {2}", a, b, Divide(a, b)); } catch (System.DivideByZeroException ex) { Console.WriteLine("Exception thrown: {0}", ex.Message); } catch (System.ArithmeticException) { Console.WriteLine("Bat ngoai le ArithmeticException"); } catch { Console.WriteLine("Bat ngoai le Unknown exception") } } public double Divide(double a, double b) { if (b == 0) throw new System.DivideByZeroException("Bat ngoai le DivideByZeroException"); if (a == 0) throw new System.ArithmeticException(); return a / b; }

Ngoài ra chúng ta có thể tự tạo ra lớp ngoại lệ của riêng chúng ta

Ném ngoại lệ (Throwing exception)

public class MyCustomException : Exception { public int SomeProperties { get; set; } public MyCustomException(int someProperties) { SomeProperties = someProperties; } }

27

TỪ KHÓA FINALLY

Khi ném ngoại lệ, phần code còn lại trong hàm sẽ không chạy Nếu chúng ta muốn một đoạn mã luôn thực thi thì chúng ta dùng từ khóa finally. (khối lệnh trong finally chắc chắn được gọi cho dù có hay không có xảy ra biệt lệ)

Từ khóa finally

29

Từ khóa finally

try { int number = Convert.ToInt32(input) } catch (FormatException e) { Console.WriteLine(“You must enter a number.”); } finally { // Đoạn mã luôn thực thi bất chấp điều gì xảy ra với try và catch }

30

Ném ngoại lệ (Throwing exception)

31

public void TestFunction() { try { double a = 5; double b = 0; Console.WriteLine("{0} /{1} = {2}", a, b, Divide(a, b)); } catch (System.DivideByZeroException ex) { Console.WriteLine("Exception thrown: {0}", ex.Message); } catch (System.ArithmeticException) { Console.WriteLine("Bat ngoai le ArithmeticException"); } catch { Console.WriteLine("Bat ngoai le Unknown exception") } finally { Console.WriteLine("Dong chuong trinh tai day"); } } public double Divide(double a, double b) { if (b == 0) throw new System.DivideByZeroException("Bat ngoai le DivideByZeroException"); if (a == 0) throw new System.ArithmeticException(); return a / b; }

Exception là cơ chế xử lý lỗi của C# Khi phát hiện lỗi, Exception sẽ đóng gói thông tin lỗi và ném ra ngoài cho đến khi một method khác bắt và xử lý lỗi đó. Nếu chúng ta biết được khối lệnh nào trong chương trình có khả năng sinh lỗi, chúng ta bao bọc khối lệnh đó bằng try-catch.

TÓM TẮT

32