ườ
ế
Tr
ng ĐH Kinh T Tp.HCM
ả
ọ Khoa Tin H c Qu n Lý
Ậ
ƯỚ
Ố ƯỢ
L P TRÌNH H
NG Đ I T
NG 1
CHƯƠNG 5: UỶ NHIỆM HÀM, SỰ KIỆN VÀ XỬ LÝ NGOẠI LỆ
Nội dung
1. Uỷ nhiệm hàm (delegate)
2. Sự kiện (event)
3. Xử lý ngoại lệ
1. Uỷ nhiệm hàm
Uỷ nhiệm hàm(delegate) là một đối tượng cho phép
chúng ta thực hiện gọi phương thức vào thời điểm mà chương trình đang thực hiện (runtime).
Uỷ nhiệm hàm không làm việc riêng lẻ mà giao cho
phương thức làm công việc của nó.
Để thực hiện khai báo một uỷ nhiệm ta sử dụng từ khóa
delegate.
Một uỷ nhiệm hàm là một đối tượng tham chiếu đến
một phương thức, chính vì vậy khi khai báo uỷ nhiệm hàm ta thực hiện khai báo khuôn dạng của phương thức mà uỷ nhiệm hàm tham chiếu đến.
1. Uỷ nhiệm hàm
Cú pháp khai báo 1 uỷ nhiệm hàm:
[bổ từ truy cập] delegate
Ví dụ: khai báo một uỷ nhiệm hàm cho phép tham chiếu đến tất cả các hàm có 2 tham số nguyên và trả về một số nguyên.
public delegate int PhepTinh(int a, int b);
1. Uỷ nhiệm hàm
class Calculator {
public double Sum(int value1, int value2, int value3)
Khai báo uỷ nhiệm
{ return value1 + value2 + value3; } } class Program { public delegate double Calculation(int x, int y, int z); static void Main(string[ ] args) { Calculator c = new Calculator(); Calculation cal = new Calculation(c.Sum); System.Console.WriteLine("Tong cua 3 so la: " + cal(1,3,4) );
} }
Tạo đối tượng uỷ nhiệm Gọi uỷ nhiệm
2. Sự kiện (Event)
Sự kiện: là một tín hiệu được thông báo giữa các
đối tượng.
Sự kiện xảy ra khi có sự tương tác giữa các đối
tượng trong hệ thống.
Sự kiện là các kích thích xảy ra bên trong hoặc bên
ngoài hệ thống.
2. Sự kiện (Event)
Các bước tạo và sử dụng sự kiện trong C#: Tạo một uỷ nhiệm hàm để cho phép tham chiếu đến các phương thức mà thực hiện tương tác lại các sự kiện (đáp ứng khi các sự kiện xảy ra).
Khai báo sự kiện với cú pháp sau:
[bổ từ truy cập] event ;
Đăng ký sự kiện bằng cú pháp “+=”
2. Sự kiện (Event)
Khai báo delagate BatCongTac
Khai báo sự kiện OnBatCongTac
public delegate void BatCongTac(bool state); public class CongTac { public event BatCongTac OnBatCongTac; public bool state; public void KhiBatCongTac() { OnBatCongTac(state); state = state ? false: true;
}
}
2. Sự kiện (Event)
Đăng ký sự kiện
public class Program { static void Main(string[] args) {
Phương thức xử lý
CongTac c = new CongTac(); BongDen b = new BongDen(); c.OnBatCongTac += new BatCongTac(b.TrangThaiDen); c.KhiBatCongTac(); c.KhiBatCongTac(); }
}
2. Sự kiện (Event)
public class BongDen { public void TrangThaiDen(bool state) {
if (state) Console.WriteLine("Den sang"); else Console.WriteLine("Den tat"); }
}
3. Xử lý ngoại lệ
Ngoại lệ (Exception): là bất kì sự bất thường nào xảy ra
không mong muốn trong ứng dụng.
Một ứng dụng tốt thì cần phải giải quyết được tất cả
các ngoại lệ có thể xảy ra.
Các kiểu ngoại lệ: có 2 kiểu ngoại lệ
Các ngoại lệ ở mức hệ thống: các ngoại lệ này là những ngoại lệ được ném ra (thrown) bởi hệ thống và thường là các nguyên nhân do hệ thống gây ra như thiếu bộ nhớ, kết nối mạng bị ngắt, phần cứng bị lỗi,….
Các ngoại lệ mức ứng dụng: là các ngoại lệ được ném ra
bởi người viết ứng dụng
3. Xử lý ngoại lệ
Tất cả các ngoại lệ trong C# đều trực tiếp hoặc gián
tiếp kế thừa từ lớp Exception, trong namespace System
Lớp Exception có các thuộc tính sau:
Message: Lưu trữ thông điệp chỉ ra nguyên nhân của ngoại lệ. Source: chỉ ra tên của ứng dụng hoặc tên của đối tượng gây
ra ngoại lệ.
StackTrace: cung cấp thông tin chi tiết về ngoại lệ trên Stack
vào thời điểm mà nó được quẳng ra.
InnerException: trả về thể hiện của ngoại lệ gây ra ngoại lệ
hiện tại
3. Xử lý ngoại lệ
Exception
IOException
SystemException
OutOfMemoryException
OverflowException
FormatException
….....
3. Xử lý ngoại lệ
C# hỗ trợ cấu trúc kiểm soát ngoại lệ xảy ra trong đoạn chương trình là try, throw, catch và finally với tổ hợp khai báo như: throw try-catch try-finally try-catch-finally
3. Xử lý ngoại lệ
1. Phát biểu throw: Dùng để phát ra tín hiệu của sự cố bất thường trong khi
chương trình thực thi với cú pháp:
throw [expression];
Trong đó: expression là đối tượng ngoại lệ.
3. Xử lý ngoại lệ
using System;
public class ThrowTest
{
public static void Main()
{
string s = null;
if (s == null)
{
throw (new ArgumentNullException()); // ném ra ngoại lệ
}
Console.Write("The string s is null"); // không được thực thi
}
}
3. Xử lý ngoại lệ
2. Phát biểu try-catch: Phát biểu try-catch dùng để đón bắt các ngoại lệ với
cú pháp như sau: try {
// mã lệnh nghi ngờ
}
catch [(expression1)] {
//mã lệnh xử lý 1
}
catch [(expression2)] {
//mã lệnh xử lý 2
}
3. Xử lý ngoại lệ
class MyClass {
public static void Main() {
MyClass x = new MyClass();
try {
string s = null;
x.MyFn(s);
}
catch (Exception e) {
Console.WriteLine("{0} First exception caught.", e);
}
}
public void MyFn(string s) {
if (s == null) throw new ArgumentNullException ();
}
}
3. Xử lý ngoại lệ
3. Phát biểu try-catch-finally:
try {
// mã lệnh nghi ngờ
}
catch [(expression)] {
//mã lệnh xử lý khi ngoại lệ phát sinh
}
finally {
//mã lệnh xử lý cho dù ngoại lệ có phát sinh hay không
}
3. Xử lý ngoại lệ
class MyClass {
public static void Main() {
MyClass x = new MyClass();
try {
string s = null;
x.MyFn(s);
}
catch (Exception e) {
Console.WriteLine("{0} First exception caught.", e); }
finally {
Console.WriteLine(“The program continues here…."); }
}
public void MyFn(string s) {
if (s == null) throw new ArgumentNullException (); }
}
3. Xử lý ngoại lệ
CÁC LỚP NGOẠI LỆ
Tên ngoại lệ
Mô tả
ế ậ ươ ng MethodAccessException ỗ ứ ượ ậ L i truy c p, do truy c p đ n thành viên hay ph ậ th c không đ c truy c p
ỗ ố ố ArgumentException L i đ i s
ứ ượ ố ố ề ượ ng th c đ c truy n đ i s null không đ c ArgumentNullException ươ ấ ậ Ph ch p nh n
ỗ ArithmeticException ế L i liên quan đ n các phép toán
ữ ể ố ư ợ ArrayTypeMismatchException ả ả ể Ki u m ng không h p, khi c l u tr ki u không thích ợ h p vào m ng
ỗ DivideByZeroException L i chia zero
ạ ị FormatException Đ nh d ng không chính xác
ợ ệ ỏ ơ ậ IndexOutOfRangeException ỉ ố , nh h n ch s ả ấ ủ ỉ ố ỏ ỉ ố ớ ả ơ ấ ớ Ch s truy c p m ng không h p l nh nh t hay l n h n ch s l n nh t c a m ng
3. Xử lý ngoại lệ
InvalidCastException Phép gán không h p lợ ệ
ượ ỗ ợ ệ ế ợ c h tr , do vi c k t h p 2 MulticastNotSupportedException Multicast không đ delegate không đúng
ả ố ữ ạ ợ ệ ố NotFiniteNumberException Không ph i s h u h n, s không h p l
ứ ọ ộ ươ ỗ ợ ng th c không h tr , khi g i m t ph ng NotSupportedException ồ ạ ớ ươ Ph ứ th c không t n t i bên trong l p.
ế NullReferenceException Tham chi u null không h p l ợ ệ .
ộ ỗ ớ OutOfMemoryException L i tràn b nh
ỗ OverflowException L i tràn phép toán
StackOverflowException Tràn stack
ở ự ở ạ ể ộ ỗ TypeInitializationException Ki u kh i t o sai, khi b kh i d ng tĩnh có l i.