Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
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
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
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)
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
Để 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
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; }