Những chủ đề tiến bộ trong C# - Lỗi và xử lí biệt lệ - Phần 3
Số trang: 12
Loại file: pdf
Dung lượng: 107.42 KB
Lượt xem: 29
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
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...
Nội dung trích xuất từ tài liệu:
Những chủ đề tiến bộ trong C# - Lỗi và xử lí biệt lệ - Phần 3 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) ...
Nội dung trích xuất từ tài liệu:
Những chủ đề tiến bộ trong C# - Lỗi và xử lí biệt lệ - Phần 3 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) ...
Tìm kiếm theo từ khóa liên quan:
lập trình tài liệu lập trình kỹ thuật lập trình giáo trình C ngôn ngữ lập trình C tự học lập trình với CTài liệu có liên quan:
-
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 310 0 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 251 0 0 -
Giới thiệu môn học Ngôn ngữ lập trình C++
5 trang 223 0 0 -
101 trang 211 1 0
-
Bài giảng Nhập môn về lập trình - Chương 1: Giới thiệu về máy tính và lập trình
30 trang 189 0 0 -
Luận văn: Nghiên cứu kỹ thuật giấu tin trong ảnh Gif
33 trang 160 0 0 -
Tìm hiểu về ngôn ngữ lập trình C: Phần 1 - Quách Tuấn Ngọc
211 trang 154 0 0 -
Giáo trình Lập trình C căn bản - HanoiAptech Computer Education Center
136 trang 143 0 0 -
161 trang 140 1 0
-
Giáo trình Vi điều khiển PIC: Phần 1
119 trang 131 0 0