Xử lý ngoại lệ
HD: ThS Nguyễn Hà Giang Khoa CNTT -Hutech
Nội dung
u Tình huống phát sinh ngoại lệ u Cách xử lý ngoại lệ làm việc trong C# u Câu lệnh try-catch-finally
Tình huống
u Những lỗiphátsinhkhirutimecóth
ể
làm hư hạich ươngtrình
u Cóth ể khôngph ải lỗi lậptrình u VD: một số tìnhhu ốngvi ết dữ liệuvào
file v Đĩa bịđầ y v Lỗiph ần cứng v File bị thay đổithànhch ỉđọ c v Khôngth ể truy cập, truy vấnCSDL v …
Cách xử lý trước đây
GET A FILENAME OPEN THE FILE IF THERE IS NO ERROR OPENING THE FILE
READ SOME DATA IF THERE IS NO ERROR READING THE DATA
PROCESS THE DATA WRITE THE DATA IF THERE IS NO ERROR WRITING THE DATA
CLOSE THE FILE IF THERE IS NO ERROR CLOSING FILE
RETURN
u Hầu hếtcác b ướccókh ả năngth ất bại
u Khóxác địnhchínhxác l ỗi từ nhữngthông
tin trả về củahàmth ư viện
u Đoạncode ph ảith ựchi ện rồi mớibi ết lỗi!
Cách xử lý Exception
TRYTO DO THESE THINGS:
GET A FILENAME OPEN THE FILE READ SOME DATA PROCESS THE DATA WRITE THE DATA CLOSE THE FILE
RETURN IF ERROR OPENING THE FILE THEN ... IF ERROR READING THE DATA THEN ... IF ERROR WRITING THE DATA THEN ... IF ERROR CLOSING THE FILE THEN ...
u Đoạncode x ử lýng ắn gọn, dễđọ c
u Logic chươngtrình h ợplý h ơn, những đoạnnghi
u Cho phép xử lýtìnhhu ống lỗirõràngvà đơngi ản!
ngờ có lỗi nằmtrongvùngTry
Các đối tượng Exception
v CLR sẽ xác định lỗivàphátsinhta
u TrongC#, khiruntime error xu ấthi ện đối
tượngException
v Đối tượngException này đượcnémtr ở lại stack chờ cho mộtph ươngth ức bắt lỗi đó.
v NếuException nàykhông đượcch ương trình“catch” thìCRL s ẽ in rathông điệp lỗi
Mô hình gọi – xử lý Exception
CLR Runtime
The Main( ) method
Method Calls Travel Down
First Method
Exceptions Passed Up
Exception Thrown Here
Sử dụng try-catch
v Đặtcode cókh ả năng dẫn đếnngo ại lệ
u Dùngtry-catch để xử lýngo ại lệ
vàokh ối“try”
v Cung cấpcáckh ối“catch” theosau“try”
v Cóth ể cung cấp tất cả catch chocác l ỗi nếumu ốn xử lý, bằngcách s ử dụng các lớpexception thích h ợp
v Nếukhôngcung c ấp“catch” cho m ột ngoại lệ, thìexception này đượclan truyềnlêntrên.
Cúpháptry-catch
Code có khả năng dẫn đến lỗi
try {
RiskyBussiness();
Tham số exception được catch
} catch (SomeException e ) {
Đoạn xử lý với tình huống có lỗi
// Handle code
}
Khối try
v Từ khóatry
v Theo saukh ối“{…}”
v Khối“{…}” b ắtbu ộcph ảicó, khác v ới
u Bao gồmcácph ần
“{…}” trongif hay for
v Đặt bất cứ câu lệnhnàocókh ả năngphát
u Bêntrongkh ốitry
sinhrango ại lệ
Khối catch
u Đặt mộthay nhi ềungaysaukh ốitry v Khôngcó l ệnhnàochengi ữahaikh ối
catch của mộtkh ốitry
u Cúphápkh ốicatch nh ư sau
catch (Exception-class [var1]) {
// xử lý ngoại lệ 1
} catch (Exception-class [var2]) {
// xử lý ngoại lệ 2
}
Ví dụ try-catch
Chương trình bị terminate
Chương trình kết thúc bình thường
Sử dụng Finally
u Khi mộtexception đượcnémra
v Luồngth ựcthi s ẽ nhảyvàokh ốicatch x ử lýnó.
v Một số đoạncode gi ảiphóngtàinguyêncóth
ể bị
bỏ qua
v Khốitry-catch cóph ầnoption là finally
v Luônluôn được gọi
v Sử dụng để dọn dẹpcáctàinguyên đang nắm
Open File Read Data Close File // ngoại lệ được phát sinh // đoạn code này bị bỏ qua, dù file chưa đóng
giữ
VD có try-catch-finally
Luôn thực thi dù có hay không có ngoại lệ!
Lệnh throw
u Cho phépnémra m ộtngo ại lệ v Cúpháp: throw exception-object
Phát sinh ra ngoại lệ
Lớp Exception
v Ngoại lệ phátsinh b ởich ươngtrình
v Ngoại lệđượ c tạo bởiCLR
u Có2lo ạingo ại lệ
u LớpSystem.Exceptionlà l ớp cơ sở cho
tất cả lớptrongC#
u 2 lớp kế thừa từ lớpnày:
v ApplicationException:th ườnglàm l ớp cơ lệ phátsinh t ừ ứng
bảncho l ớpngo ại dụng
v SystemException:doCLRphátsinh
Lớp Exception (2)
Một số lớpException th ườngdùng v System.OutOfMemoryException v System.NullReferenceException v Syste.InvalidCastException v Syste.ArrayTypeMismatchException v System.IndexOutOfRangeException v System.ArithmeticException v System.DevideByZeroException v System.OverFlowException
Tự tạo lớp exception
VD truy xuất file
Tóm tắt
u Exceptionlàmchoch
ươngtrìnhch ặt chẽ hơn.Tránhterminatech ươngtrình độtng ộtvình ững lỗiruntime
u Tậpcác l ớpException
đa dạng,bao
hàmcác v ấn đề phátsinhlúcruntime
u LớpExceptionlà l ớp cơ sở chocác l ớp
xử lýngo ại lệ trong.NET
u Dễ dàng địnhngh ĩa lớpngo ại

