chuong 5
Chương 5:
Bắt lỗi trên giao diện người dùng
Nội dung chính
Tìm hiểu về ngoại lệ
Bắt ngoại lệ
Tạo và sử dụng ngoại lệ
Quản lý các ngoại lệ không thể bắt
Kiểm tra đầu vào
1. Tìm hiểu về ngoại lệ
Ngoại lệ xảy ra khi chương trình gặp phải những vấn đề không như mong đợi như: tràn bộ nhớ, lỗi đọc file ...
Có thể do lỗi lập trình hoặc khi thực thi chương trình.
Khi chương trình gặp ngoại lệ, nó sẽ trả ra ngoại lệ và đột ngột dừng chương trình, sau đó là hiển thị thông báo lỗi.
Chương trình phải bắt được các trường hợp ngoại lệ.
Tìm hiểu về ngoại lệ ...
Ngoại lệ là một đối tượng gồm các thông tin về những vấn đề xảy ra trong lúc thực thi chương trình.
FCL cung cấp 2 loại ngoại lệ:
ApplicationException: biểu diễn các ngoại lệ do ứng dụng trả về
SystemException: biểu diễn các ngoại lệ do CLR trả về.
Các ngoại lệ đều kế thừa từ lớp Exception
HelpLink: xác định URL của file trợ giúp có quan hệ với ngoại lệ.
InnerException: xác định ngoại lệ khác có quan hệ với ngoại lệ được trả về.
Message: hiển thị thông tin gây ra lỗi và cung cấp giải pháp.
Source: xác định tên của ứng dụng gây ra lỗi.
StackTrace: xác định lỗi xảy ra ở đâu.
TargetSite: biểu diễn phương thức trả về ngoại lệ hiện tại
2. Bắt ngoại lệ
Một ứng dụng phải bắt được ngoại lệ và lấy lại được trạng thái trong khi xảy ra ngoại lệ.
.NET Framework hỗ trợ bắt lỗi
Trong C#, có thể sử dụng kết hợp các câu lệnh: try, catch, finally và throw.
2.1. Khối try
Nên đặt mã lệnh có thể gây ra ngoại lệ trong khối try, như sau:
try
{ ... }
Khối try có thể lồng nhau.
Khi chạy chương trình, sẽ có một cấu trúc phân cấp các khối try.
Khi xảy ra ngoại lệ:
CLR sẽ tìm tới dấu ngoặc đóng của khối try gần nhất và chuyển điều khiển tới khối catch hoặc finally tương ứng với khối try đó.
Nếu không có khối catch tương ứng, ngoại lệ sẽ được chuyển tới mã lệnh gọi nó.
Nếu ngoại lệ vẫn không được bắt thì nó sẽ được chuyển theo cấu trúc phân cấp của các lời gọi phương thức.
Cuối cùng, ngoại lệ sẽ được chuyển tới CLR và ứng xử mặc định là ngừng chương trình đột ngột.
Khối try không tồn tại một mình, sau đó phải có khối catch hoặc finally.
2.2. Khối catch
Có thể đặt một số khối catch tiếp sau khối try.
Mỗi khối catch bắt một loại ngoại lệ.
Khi xảy ra ngoại lệ thì CLR sẽ tìm tới khối catch tương ứng có thể bắt ngoại lệ đó.
try
{ ...}
catch(ExceptionTypeA)
{ ... }
catch(ExceptionTypeB)
{ ... }
Khối catch ...
Cách tìm ngoại lệ tương ứng của CLR rất đơn giản:
CLR tìm khối catch đầu tiên có ngoại lệ trùng với ngoại lệ được trả về hoặc bất kỳ lớp cơ sở nào của ngoại lệ đó.
Ví dụ, ngoại lệ DivideByZeroException có thể tương ứng với các ngoại lệ: DivideByZeroException, ArithmeticException, SystemException, và Exception.
Nếu có nhiều khối catch, chỉ có khối catch đầu tiên tương ứng được thực hiện và tất cả các khối catch sẽ bị bỏ qua.
Khi viết nhiều khối catch, cần phải sắp xếp chúng từ những kiểu ngoại lệ cụ thể đến những kiểu ngoại lệ chung hơn.
Ví dụ, sau khối catch bắt DivideByZeroException là khối catch bắt ngoại lệ ArithmeticException.
Chương trình dịch sẽ báo lỗi nếu ta không làm theo quy tắc này.
2.3. Lệnh throw
Lệnh throw tạo ra ngoại lệ một cách tường minh.
Sử dụng throw khi luồng điều khiển đi tới một trường hợp bất thường.
Trả về ngoại lệ trong khối catch: sử dụng lệnh throw để trả lại các ngoại lệ đã được bắt
catch(Exception e)
{
throw;
}
Sử dụng lệnh throw để trả về ngoại lệ được tạo ra. Ví dụ:
string strMessage ="EndDate should be greater than the StartDate";
ArgumentOutOfRangeException newException =new ArgumentOutOfRangeException(strMessage);
throw newException;
Gán thêm các thông tin bổ sung và sau đó mới trả ra ngoại lệ.
catch(ArgumentNullException ane)
{
string strMessage = "CustomerID cannot be null";
ArgumentNullException newException = new ArgumentNullException(strMessage, ane);
throw newException;
}
2.4. Khối finally
Khối finally chứa mã lệnh luôn luôn được thực hiện dù ngoại lệ có xảy ra hay không.
Mã lệnh trong khối finally thường để bảo lưu trạng thái của ứng dụng, bảo đảm tính nhất quán ...
Ví dụ: đóng file, ngắt kết nối CSDL và các nguồn vào/ra ...
Không nhất thiết phải có khối finally sau khối try. Nhưng nếu có thì chỉ có một khối finally.
Khối finally phải xuất hiện sau tất cả các khối catch.
3. Tạo và sử dụng ngoại lệ
.NET Framework cho phép định nghĩa các lớp ngoại lệ.
Để đảm bảo tính thống nhất, nên thực hiện những nguyên tắc sau:
Ch ỉ t ạo ra l ớp ngo ại l ệ khi không có ngo ại l ệ nào đáp ứng đư ợc yêu c ầu.
Th ừa k ế t ừ l ớp System.ApplicationException.
4. Quản lý các ngoại lệ không thể bắt
Các ứng dụng được quản lý bởi CLR thực thi trong môi trường riêng biệt (miền ứng dụng).
Lớp System.AppDomain biểu diễn miền ứng dụng đó.
Cung cấp các sự kiện: assembly được load, miền ứng dụng bị unload, hoặc ứng dụng trả ra một ngoại lệ.
Khi không thể bắt được ngoại lệ, sự kiện UnhandledException của lớp AppDomain sẽ xảy ra
Thuộc tính của lớp UnhandledExceptionEventArgs
ExceptionObject: xác định đối tượng ngoại lệ không thể bắt tương ứng với miền ứng dụng hiện tại.
IsTerminating: chỉ ra CLR đang ngừng
Các thành phần của lớp Event Log
Clear(): xoá trắng event log
CreateEventSource(): tạo ra nguồn sự kiện để ta viết log
Entries: lấy tất cả nội dung của event log
Log: xác định tên của log được đọc hoặc ghi
MachineName: xác định tên máy tính được dùng để đọc hoặc ghi sự kiện
Source: xác định tên của nguồn sự kiện được đăng ký và sử dụng khi viết event log
SourceExists(): xác định liệu nguồn sự kiện đã tồn tại trên máy tính chưa.
WriteEntry(): viết sự kiện lên event log
5. Kiểm tra đầu vào
Một số kỹ thuật kiểm tra dữ liệu:
Hạn chế giá trị dữ liệu bằng cách sử dụng các điều khiển như: Combo Box, Check Box ...
Bắt các phím nhấn và phân tích chúng để kiểm tra. Ví dụ: trường dữ liệu chỉ cho phép nhập ký tự số không được là chữ.
Hạn chế một số trường dữ liệu thông qua thuộc tính Enabled, phụ thuộc vào trạng thái của các trường khác.
Phân tích nội dung của toàn bộ các trường dữ liệu và cảnh báo người sử dụng về những giá trị không hợp lệ khi người đó muốn rời khỏi trường dữ liệu hoặc đóng cửa sổ
5.1. Kiểm tra ở mức nhấn phím
Khi nhấn phím trên điều khiển, có 3 sự kiện lần lượt xảy ra:
KeyDown
KeyPress: chỉ xảy ra khi phím được nhấn là ký tự
KeyUp
Tham số KeyPressEventArgs.
Handled: xác định sự kiện có được bắt hay không
KeyChar: trả về giá trị ký tự tương ứng của phím được nhấn.
Tham số KeyEventArgs:
Alt: trả về true nếu phím Alt được nhấn
Control: trả về true nếu phím Ctrl được nhấn
Handled: xác định sự kiện có được bắt hay không
KeyCode: trả về mã bàn phím. Giá trị của nó thuộc kiểu enum Keys
KeyData: trả về mã phím được nhấn, và cờ xác định có nhấn kèm với các phím Ctrl, Shift, và Alt.
KeyValue: trả về giá trị nguyên biểu diễn thuộc tính KeyData
Modifiers: trả về các cờ để xác định các phím Ctrl, Shift, và Alt có được nhấn hay không.
Shift: trả về true nếu phím Shift được nhấn.
5.2. Kiểm tra ở mức trường dữ liệu
Để đảm bảo rằng giá trị được nhập vào trường phù hợp với các yêu cầu của ứng dụng.
Khi người sử dụng nhập và rời khỏi trường dữ liệu, các sự kiện sau lần lượt sẽ xảy ra:
Enter: xảy ra khi vào điều khiển
GotFocus: khi điều khiển nhận focus
Leave: xảy ra khi focus rời khỏi điều khiển
Validating: xảy ra khi điều khiển đang kiểm tra
Validated: xảy ra khi điều khiển đã kiểm tra xong
LostFocus: xảy ra khi điều khiển mất focus
Sự kiện Validating
Thường được sử dụng để lưu logic kiểm tra đối với 1 trường dữ liệu.
Có tham số kiểu CancelEventArgs
Thuộc tính Cancel sẽ huỷ sự kiện nếu được gán bằng true.
Trong sự kiện Validating, viết những mã lệnh sau:
Tự động kiểm tra lỗi hoặc thiếu sót do người sử dụng tạo ra.
Hiển thị các thông báo lỗi để người sử dụng biết và sửa nó.
Nếu ta muốn người sử dụng phải sửa lỗi trước khi chuyển sang thao tác khác thì trong sự kiện Validating, ta có thể sử dung hai cách sau:
Sử dụng phương thức Focus() của điều khiển
Gán thuộc tính Cacel của CancelEventArgs bằng true. Nó sẽ dừng việc kiểm tra và chuyển focus tới điều khiển.
Sự kiện Validating ...
Sự kiện Validating của Form xảy ra khi đóng form.
Nếu trong sự kiện Validating, gán thuộc tính Cancel của CancelEventArgs bằng true thì thao tác đóng Form cũng bị dừng lại.
Không thể gán thuộc tính Cancel của CancelEventArgs bằng true khi người sử dụng click nút Close. (Vì nó nằm ở ngoài client area của Form).
Để sử dụng nút Help, gán thuộc tính CausesValidation của nó là false
Thành phần ErrorProvider
Cho phép gán một biểu tượng cạnh trường dữ liệu bị lỗi.
Các thành phần quan trọng của lớp ErrorProvider:
BlinkRate: xác định độ nháy của biểu tượng
BlinkStyle: xác định giá trị chỉ ra số lần nháy của biểu tượng
ContainerControl: xác định thành phần cha của điều khiển
GetError(): trả về xâu mô tả lỗi cho một điều khiển
Icon: xác định biểu tượng hiển thị cạnh điều khiển.
SetError(): gán xâu mô tả lỗi cho một điều khiển
SetIconAlignment(): gán vị trí đặt biểu tượng.
IconPadding(): xác định vùng không gian ở giữa biểu tượng và điều khiển.
5.3. Hiển thị điều khiển dựa trên đầu vào
Sử dụng thuộc tính Enabled của điều khiển để giới hạn việc nhập dữ liệu đầu vào (cho phép nhận hoặc không nhận focus).
5.4. Các thuộc tính kiểm tra khác
Thuộc tính CharacterCasing: cho phép chuyển các ký tự thành kiểu chữ hoa, chữ thường ...
Thuộc tính MaxLength: xác định số lượng ký tự lớn nhất mà người sử dụng có thể nhập.
Theo m ặc đ ịnh, MaxLength b ằng 0, (chi ều dài c ủa xâu nh ập có th ể tu ỳ ý, ph ụ thu ộc vào dung lư ợng nh ớ).
Bạn đang đọc truyện trên: AzTruyen.Top