Đầu vào của các objects và phát biểu try-except
Bạn có thể load các objects được pickle vào một chương trình từ một file sử dụng hàm pickle.load. Nếu phần cuối
của file đã được đi đến, hàm này dấy lên một ngoại lệ. Cái này làm phức tạp quá trình đầu vào, vì chúng ta không
có cách thức rõ ràng để phát hiện phần cuối của file trước khi ngoại lệ được dấy. Tuy nhiên, phát biểu try-except
của Python đi vào cứu chúng ta. Như bạn đã học ở các học phần trước, phát biểu này cho phép một ngoại lệ sẽ được
bắt và chương trình sẽ phục hồi. Cú pháp của một phát biểu try-except đơn giản là như sau:
try:
<statements>
except <exception type>:
<statements>
Khi phát biểu này được chạy, các phát biểu bên trong mệnh đề try được thực thi. Nếu một trong các phát biểu dấy lên
một ngoại lệ, kiểm soát ngay lập tức được chuyển tới mệnh đề except. Nếu dạng của ngoại lệ được dấy khớp với dạng
trong mệnh đề này, các phát biểu của nó được thực thi. Mặt khác, kiểm soát được chuyển tới nơi gọi của phát biểu
try-except và lên xa hơn trong chuỗi các lời gọi, cho đến khi ngoại lệ được xử lí thành công hay chương trình dừng
với một thông điệp lỗi. Nếu các phát biểu trong mệnh đề try không dấy lên ngoại lệ, mệnh đề except bị bỏ qua, và
kiểm soát tiến lên tới cuối của phát biểu try-except.
Chúng ta bây giờ có thể xây dựng một vòng lặp file đầu vào cái tiếp tục load các objects cho đến khi cuối file được
gặp. Khi cái này xảy ra, một EOFError được dấy. Mệnh đề except sau đó đóng file và ra khỏi vòng lặp. Chúng ta cũng
thêm một biến thực thể mới để theo dấu tên file của bank cho lưu bank vào file. Sau đây là code cho một phương thức
Bank _init_ cái có thể lấy một vài accounts ban đầu từ một file đầu vào. Phương thức này bây giờ hoặc tạo một bank
rỗng, mới nếu tên file không có mặt, hay load các accounts từ một file vào một Bank object.
def __init__(self, fileName = None):
“””Creates a new dictionary to hold the accounts.
If a filename is provided, loads the accounts from
a file of pickled accounts.”””
self.accounts = {}
self.fileName = fileName
if fileName:fileObj = open(fileName, “rb”)
while True:try:
account = pickle.load(fileObj)
self.add(account)except EOFError:
fileObj.close()
break
