intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

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

Chia sẻ: Nguyen Uyen | Ngày: | Loại File: PDF | Số trang:12

125
lượt xem
13
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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...

Chủ đề:
Lưu

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

  1. 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;
  2. 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 {
  3. 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.
  4. 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') {
  5. 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í.
  6. 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");
  7. 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:
  8. 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
  9. 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
  10. { 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
  11. 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
  12. 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
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2