637
Chương 16: Các giao diện và mẫu thông dụng
•
System.FormatException
—khi mã lệnh truyền cho phương thức một đối số
String
chứa
dữ liệu không được định dạng đúng.
Nếu không có lớp ngoại lệ nào đáp ứng được nhu cầu của bạn, hoặc bạn cảm thấy ứng dụng
của bạn sẽ được lợi từ việc sử dụng các ngoại lệ đặc-trưng-ứng-dụng, bạn có thể tạo một lớp
ngoại lệ cho mình. Để tích hợp ngoại lệ tùy biến với cơ chế thụ lý ngoại lệ của bộ thực thi và
vẫn giữ tính nhất quán với mẫu được hiện thực bởi các lớp ngoại lệ có sẵn, bạn cần:
•
Đặt một tên có ý nghĩa cho lớp ngoại lệ tùy biến, kết thúc bằng từ
Exception
, chẳng
hạn,
TypeMismatchException
hay
RecordNotFoundException
.
•
Thừa kế lớp
ApplicationException
. Về cơ bản, lớp ngoại lệ tùy biến phải thừa kế lớp
System.Exception
, nếu không trình biên dịch sẽ dựng lên lỗi khi bạn ném ngoại lệ.
ApplicationException
thừa kế
Exception
và được đề nghị làm lớp sơ sở cho tất cả các
lớp ngoại lệ đặc-trưng-ứng-dụng.
•
Đánh dấu lớp ngoại lệ tùy biến là
sealed
nếu bạn không muốn các lớp ngoại lệ khác có
thể thừa kế nó.
•
Hiện thực thêm các thuộc tính và các thành viên dữ liệu để hỗ trợ các thông tin tùy biến
mà lớp ngoại lệ này cung cấp.
•
Hiện thực ba phương thức khởi dựng
public
với chữ ký như dưới đây và bảo đảm
chúng gọi phương thức khởi dựng của lớp cơ sở:
public CustomException() : base() {}
public CustomException(string message): base(message) {}
public CustomException(string message, Exception inner)
: base(message, inner) {}
•
Làm cho lớp ngoại tùy biến trở nên khả-tuần-tự-hóa để bộ thực thi có thể marshal các
thể hiện của nó qua các biên miền ứng dụng và biên máy. Áp dụng đặc tính
System.SerializableAttribute
thường là đã đủ cho các lớp ngoại lệ không hiện thực
các thành viên dữ liệu tùy biến. Tuy nhiên, vì
Exception
hiện thực giao diện
System.Runtime.Serialization.ISerializable
nên nếu ngoại lệ của bạn có khai báo
các thành viên dữ liệu tùy biến, bạn phải chép đè phương thức
ISerializable.GetObjectData
của lớp
Exception
cũng như hiện thực một phương thức
khởi dựng giải tuần tự hóa với chữ ký như dưới đây. Nếu lớp ngoại lệ của bạn là
sealed
, đánh dấu phương thức khởi dựng giải tuần tự hóa là
private
; nếu không thì
đánh dấu nó là
protected
.
private CustomException(SerializationInfo info,
StreamingContext context) {}
Phương thức
GetObjectData
và phương thức khởi dựng giải tuần tự hóa phải gọi
phương thức tương đương trong lớp cơ sở để cho phép lớp cơ sở thực hiện tuần tự hóa
và giải tuần tự hóa dữ liệu của nó một cách đúng đắn (xem mục 16.1 để biết cách làm
cho một lớp trở nên khả-tuần-tự-hóa).
Dưới đây là một lớp ngoại lệ tùy biến có tên là
CustomException
(thừa kế lớp
ApplicationException
). Lớp này khai báo hai thành viên dữ liệu tùy biến: một chuỗi có tên là
stringInfo
và một giá trị luận lý có tên là
booleanInfo
.