Tải bản đầy đủ (.pdf) (12 trang)

Những chủ đề tiến bộ trong C# - Lỗi và xử lí biệt lệ - Phần 3 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (107.42 KB, 12 trang )

Những chủ đề tiến bộ trong C#
Lỗi và xử lí biệt lệ - Phần 3


Tung biệt lệ do người sử dụng định nghĩa
Bây giờ ta hãy nhìn vào định nghĩa của lớp xử lí việc đọc tập tin , và tung ra
một biệt lệ riêng ColdCallFileReader.lớp này được dẫn xuất từ IDisposable
class ColdCallFileReader :IDisposable
{
FileStream fs;
StreamReader sr;
uint nPeopleToRing;
bool isDisposed = false;
bool isOpen = false;
FileStream and StreamReader cả hai đều nằm trong namspace system.IO, là
lớp cơ sở mà chúng ta sẽ dùng để đọc tập tin. filestream cho phép chúng ta
nối đến tập tin ở nơi đầu tiên, trong khi StreamReader được đẩy mạnh để
đọc tập tin kí tự,và thực thi phương thức , StreamReader(), đọc 1 dòng trong
tập tin.
Trường IsDispose chỉ định liệu phương thức Dispose() có được gọi hay
không.Isopen được dùng cho việc kiểm tra lỗi -trong trường hợp này ,kiểm
tra xem liệu Streamreader có thực sự nối đến một tập tin đang mở không.
quy trình mở và đọc dòng đầu tiên -cho biết có bao nhiêu người trong tập tin
được xử lí bằng phưong thức open()
public void Open(string fileName)
{
if (isDisposed)
throw new ObjectDisposedException("peopleToRing");
fs = new FileStream(fileName, FileMode.Open);
sr = new StreamReader(fs);
try


{
string firstLine = sr.ReadLine();
nPeopleToRing = uint.Parse(firstLine);
isOpen = true;
}
catch (FormatException e)
{
throw new ColdCallFileFormatException(
"First line isn\'t an integer", e);
}
}
Dòng đầu tiên kiểm tra xem liệu mã client có gọi không hợp lí nó sau khi đối
tượng bị huỷ hay không .ném ra một đối tượng ObjectDisposedException
được định nghĩa trước nếu nó xuất hiện.
Kế tiếp phương thức chứa đựng khối try đầu tiên, mục đích của khối này là
đón bắt bất kì lỗi trả về từ dòng đầu tiên không chứa đựng một số nguyên,
nếu vấn đề phát ra , thời gian chạy .NET sẽ tung ra biệt lệ FormatException
mà chúng ta sẽ bắt và chuyển thành một biệt lệ có nhiều ý nghĩa hơn.biệt lệ
mới được tung ra sẽ bị bẫy bởi khối try ngoài nhất.
Nếu mọi thứ tốt đẹp , chúng ta sẽ thiết lập trường isopen là true để chỉ định
việc kết nối đến tập tin đang có giá trị.và dữ liệu có thể được đọc.
phương thức ProcessNextPerson() chứa đựng khối try bên trong
public void ProcessNextPerson()
{
if (isDisposed)
throw new ObjectDisposedException("peopleToRing");
if (!isOpen)
throw new UnexpectedException(
"Attempt to access cold call file that is not open");
try

{
string name;
name = sr.ReadLine();
if (name == null)
throw new ColdCallFileFormatException("Not enough names");
if (name[0] == 'Z')
{
throw new LandLineSpyFoundException(name);
}
Console.WriteLine(name);
}
catch(LandLineSpyFoundException e)
{
Console.WriteLine(e.Message);
}
finally
{
}
}
Có 2 vấn đề cần quan tâm trong công đoạn này :
Thứ nhất là đọc tên của người gián điệp khi đó khối catch trong phương thức
này sẽ xử lí. bởi vì biệt lệ bị bắt ở đây bên trong vòng lặp nghĩa là việc thực
thi có thể tiếp tục trong phương thức main() của chương trình, và tên tiếp
theo trong tập tin sẽ xử lí.
thứ hai là khi đọc tên của người kế tiếp thì thấy rằng đã đến vị trí kết thúc
tập tin , cách mà phương thức StreamReader's ReadLine() làm việc là nếu
chúng ta đã qua điểm kết thúc tập tin , thì nó không ném ra biệt lệ mà chỉ trả
về null, nếu ta tìm thấy chuỗi null ta biết rằng tập tin định dạng sai và ta ném
ra biệt lệ ColdCallFileFormatException mà sẽ đưọc bắt bởi hàm xử lí biệt lệ
bên ngoài.( là nguyên nhân của việc thực thi bị ngắt)

Thuộc tính NPeopleToRing cho biết số người dự định sẽ có trong tập tin.
Phương thức Dispose() mà đóng một tập tin . nó sẽ kiểm tra có thực là có
một tập tin để đóng trước khi đóng.
public uint NPeopleToRing
{
get
{
if (isDisposed)
throw new ObjectDisposedException("peopleToRing");
if (!isOpen)
throw new UnexpectedException(
"Attempt to access cold call file that is not open");
return nPeopleToRing;
}
}
public void Dispose()
{
if (isDisposed)
return;
isDisposed = true;
isOpen = false;
if (fs != null)
{
fs.Close();
fs = null;
}
}
Định nghĩa một lớp biệt lệ
Cuối cùng chúng ta cần định nghĩa 3 lớp biệt lệ riêng . sau đây là sự thi hành
đầy đủ của lớp LandLineSpyFoundException:

class LandLineSpyFoundException : ApplicationException
{
public LandLineSpyFoundException(string spyName)
: base("LandLine spy found, with name " + spyName)
{
}
public LandLineSpyFoundException(
string spyName, Exception innerException)
: base(
"LandLine spy found with name " + spyName, innerException)
{
}
}
Lưu ý rằng ta dẫn xuất nó từ ApplicationException,
Chúng ta giả sử rằng thông điệp được truyền vào hàm dựng chỉ là tên của
người gián điệp được tìm thấy.chúng ta cũng cung cấp 2 hàm dựng , một cái
đơn giản lấy thông điệp, cái kia cũng lấy biệt lệ bên trong như là 1 thông
số.khi định nghiã lớp biệt lệ riêng biệt ta nên xây dựng ít nhất 2 hàm dựng (
mặc dù trong thí dụ trên chúng ta không cần hàm dựng thứ 2 )
Sau đây là lớp ColdCallFileFormatException. :
class ColdCallFileFormatException : ApplicationException
{
public ColdCallFileFormatException(string message)
: base(message)
{
}
public ColdCallFileFormatException(
string message, Exception innerException)
: base(message, innerException)
{

}
}
Và cuối cùng là lớp UnexpectedException mà cũng gần giống như lớp
ColdCallFieFormatException:
class UnexpectedException : ApplicationException
{
public UnexpectedException(string message)
: base(message)
{
}
public UnexpectedException(string message, Exception innerException)
: base(message, innerException)
{
}
}
Bây giờ ta sẵn sàn để kiểm tra chương trình. tạo ra 2 tập tin một cái là tập tin
hợp lệ people.txt và cái thứ 2 không hợp lệ people2.txt
people2.txt
49
Avon from 'Blake's 7'
Zbigniew Harlequin
Simon Robinson
Christian Peak
và cuối cùng thử một tập tin không tồn tại people3.txt. chạy 3 lần ta có các
kết quả sau :
MortimerColdCall
Please type in the name of the file containing the names of the people to be
cold-called > people.txt
Avon from 'Blake's 7'
LandLine spy found, with name Zbigniew Harlequin

Simon Robinson
Christian Peak
All callees processed correctly

MortimerColdCall
Please type in the name of the file containing the names of the people to be
cold-called > people2.txt
Avon from 'Blake's 7'
LandLine spy found, with name Zbigniew Harlequin
Simon Robinson
Christian Peak
The file people2.txt appears to have been corrupted
Details of the problem are: Not enough names

MortimerColdCall
Please type in the name of the file containing the names of the people to be
cold-called > people3.txt
The file people3.txt does not exist

×