Bài giảng Lập trình Python: Bài 8 Ngoại lệ và xử lý ngoại lệ cung cấp cho người học những kiến thức như: Ngoại lệ là gì?; Xử lý ngoại lệ; Một số loại ngoại lệ thường gặp; Tự sinh ngoại lệ; Bài tập. Mời các bạn cùng tham khảo!
LẬP TRÌNH PYTHON Bài 8: Ngoại lệ xử lý ngoại lệ Tóm tắt nội dung trước ▪ Kiểu liệu từ điển kiểu liệu lấy cảm hứng từ từ điển sống ▪ ▪ ▪ ▪ Từ điển tập mục, mục cặp key value Các key phải đôi khác nhau, phải kiểu liệu bất biến Có thể tra cứu value thơng qua phép tốn mục với key Dữ liệu từ điển khơng có tính thứ tự, duyệt vịng lặp ▪ Module Package chế Python sử dụng để kiểm soát mã nguồn hiệu ▪ Một file mã nguồn = module, tái sử dụng import ▪ Một thư mục chứa mã nguồn = package ▪ Module math chứa nhiều hàm toán học TRƯƠNG XUÂN NAM Nội dung Ngoại lệ gì? Xử lý ngoại lệ Một số loại ngoại lệ thường gặp Tự sinh ngoại lệ Bài tập TRƯƠNG XUÂN NAM Phần Ngoại lệ gì? TRƯƠNG XUÂN NAM Ngoại lệ gì? ▪ Việc chương trình máy tính hoạt động khơng hồn hảo khơng thể tránh khỏi ▪ Thường giới lập trình chia lỗi thành nhóm Lỗi viết chương trình: hệ chương trình khơng chạy gặp dịng lệnh sai, thông dịch (hoặc không dịch được, biên dịch) Lỗi chương trình chạy: hệ phải thực lại • Chẳng hạn nhập liệu khơng đúng, phải nhập lại Ngoại lệ: lỗi, xảy có bất thường khiến chức thực • Chẳng hạn ghi liệu file, file lại bị tiến trình khác xóa ▪ Ngoại lệ = lỗi? Đúng, không hẳn TRƯƠNG XUÂN NAM Ngoại lệ gì? ▪ Ranh giới ngoại lệ lỗi mong manh, chí khó phân biệt nhiều tình ▪ Vấn đề: Cách chia lỗi thành nhóm có khuynh hướng cho mơi trường thực thi chương trình thân thiện hồn hảo ▪ Python quan điểm nên chia lỗi thành loại ▪ Syntax error: viết sai cú pháp, khiến chương trình thơng dịch khơng dịch được, trường hợp lập trình viên phải viết lại mã, khơng có phương án khác ▪ Exception: xảy bất thường không thiết kế • Như xử lý exception khiến chương trình ổn định hoạt động tốt tình • Trường hợp lập trình viên phải có phương án khắc phục TRƯƠNG XUÂN NAM Ngoại lệ gì? ▪ Ví dụ syntax error: >>> while True print('Hello world') File "", line while True print('Hello world') ^ SyntaxError: invalid syntax ▪ Ví dụ exception: >>> 10 * (1/0) Traceback (most recent call last): File "", line 1, in ZeroDivisionError: division by zero ▪ Có vẻ syntax error exception!!! TRƯƠNG XUÂN NAM Phần Xử lý ngoại lệ TRƯƠNG XUÂN NAM “xử lý” ngoại lệ Vòng lặp nhập X người dùng nhập vào giá trị số while True: try: x = int(input("Nhập số X: ")) break Khối nhập X (có thể nhập lỗi) except ValueError: print("Lỗi, nhập lại.") Xử lý lỗi xảy print("X =", x) TRƯƠNG XUÂN NAM Cú pháp try-except-else-finally ▪ Cú pháp: try: except: else: finally: ▪ Công việc khối: ▪ Khối “try”: đoạn mã có khả gây lỗi, lỗi xảy ra, khối bị dừng dòng gây lỗi ▪ Khối “except”: đoạn mã xử lý lỗi, thực có lỗi xảy ▪ Khối “else”: xuất sau khối except cuối cùng, đoạn mã thực khơng có except thực (đoạn try khơng có lỗi) ▪ Khối “finally”: cịn gọi khối clean-up, ln thực dù có xảy lỗi hay không TRƯƠNG XUÂN NAM 10 Phần Một số loại ngoại lệ thường gặp TRƯƠNG XUÂN NAM 14 Một số loại ngoại lệ thường gặp Ngoại lệ Lý gây SystemExit Xảy chương trình gọi hàm sys.exit() KeyboardInterrupt Xảy người dùng nhấn phím ngắt để cố gắng kết thúc chương trình (thường Ctrl-C Delete) Xảy chương trình đóng sinh (generator) GeneratorExit hàm close() Chú ý: không thực lỗi Lớp cha lớp lỗi, ngoại trừ KeyboardInterrupt, Exception SystemExit GeneratorExit Xảy cố gắng đọc đối tượng từ iterator, StopIteration iterator cuối kiểu nên khơng có đối tượng cần đọc Xảy cố gắng đọc đối tượng từ iterator bất StopAsyncIteration đồng bộ, iterator chưa đồng đối tượng TRƯƠNG XUÂN NAM 15 Một số loại ngoại lệ thường gặp Ngoại lệ Lý gây ArithmeticError Lớp cha lỗi xử lý tính tốn FloatingPointError Lớp ArithmeticError (hiện bỏ không dùng, giữ lại để tương thích với mã cũ) OverflowError Lớp ArithmeticError, xảy kết phép toán số học lớn nhỏ đến mức biểu diễn ZeroDivisionError Lớp ArithmeticError, xảy thực phép chia phép đồng dư với số AssertionError Xảy câu lệnh kiểm tra điều kiện assert thất bại AttributeError Xảy khơng thể gán thuộc tính tham chiếu BufferError Xảy tạo vùng đệm bị tràn vùng đệm TRƯƠNG XUÂN NAM 16 Một số loại ngoại lệ thường gặp Ngoại lệ Lý gây Xảy cố gắng đọc thêm liệu đến cuối tập tin (không thể đọc thêm nữa) Xảy chương trình khai báo sử dụng thành phần thư ImportError viện (một hàm, biến lớp) khơng tìm thấy thành phần Kiểu ImportError, xảy chương trình khai báo sử ModuleNotFoundE dụng thư viện Python khơng thể nạp thư viện rror máy (thường khơng tìm thấy mã máy thư viện đó) EOFError LookupError IndexError KeyError Lớp cha lỗi xảy tìm kiếm liệu Kiểu LookupError, xảy giá trị mục (index) nằm phạm vi biến kiểu (string, list, tuple,…) Kiểu LookupError, xảy khơng tìm thấy khóa từ điển TRƯƠNG XN NAM 17 Một số loại ngoại lệ thường gặp Ngoại lệ Lý gây MemoryError Xảy hết nhớ nên chương trình khơng thể tiếp tục thực thi nhớ bị phân mảnh đến mức tạo biến cần thiết để tiếp tục thực thi chương trình NameError Xảy cố gắng truy cập biến không tồn UnboundLocalError Kiểu NameError, xảy tham chiếu đến biến cục biến cục khơng tồn Xảy tham chiếu bị lỗi, chẳng hạn truy cập biến thuộc tính bị dọn rác (garbage collector) xóa Xảy lỗi thực thi chung chung, khơng rơi vào nhóm RuntimeError lỗi biết Kiểu RuntimeError, xảy chương trình cố gắng NotImplementedEr thực thi phương thức hàm, lý ror phần thân hàm (phương thức) chưa viết ReferenceError TRƯƠNG XUÂN NAM 18 Một số loại ngoại lệ thường gặp Ngoại lệ Lý gây Xảy thực hàm liên quan đến hệ thống (chẳng hạn đọc ghi đĩa) gặp lỗi Để giữ tương thích với phiên trước, lỗi cịn có tên khác IOError, EnvironmentError WindowsError Đây lớp lớn cung cấp nhiều thông tin lỗi làm việc với hệ điều hành, lớp lớp gồm: - OSError - BlockingIOError ChildProcessError ConnectionError o BrokenPipeError o ConnectionAbortedError o ConnectionRefusedError o ConnectionResetError FileExistsError FileNotFoundError InterruptedError IsADirectoryError NotADirectoryError PermissionError ProcessLookupError TimeoutError TRƯƠNG XUÂN NAM 19 Một số loại ngoại lệ thường gặp Ngoại lệ Lý gây RecursionError Kiểu RuntimeError, xảy gọi đệ quy nhiều lớp (độ sâu lớn) SyntaxError Xảy cố gắng chạy lệnh viết sai cú pháp IndentationError Kiểu SyntaxError, xảy cố gắng chạy lệnh viết thụt lề khơng xác TabError Kiểu IndentationError, xảy thụt lề sử dụng dấu tab dấu space khơng qn SystemError Xảy trình thơng dịch gặp lỗi nội TypeError Xảy chương trình cố gắng chuyển đối tượng sang kiểu khác không phù hợp (chẳng hạn cố gắng đổi chuỗi tên riêng sang dạng số nguyên) TRƯƠNG XUÂN NAM 20 Một số loại ngoại lệ thường gặp Ngoại lệ Lý gây ValueError Xảy hàm phương thức phép toán nhận đối số có kiểu giá trị khơng phù hợp UnicodeError Kiểu ValueError, xảy có lỗi liên quan đến trình xử lý liệu unicode UnicodeEncodeError Kiểu UnicodeError, xảy lỗi liên quan đến q trình mã hóa liệu UnicodeDecodeError Kiểu UnicodeError, xảy lỗi liên quan đến trình giải mã liệu UnicodeTranslateError Kiểu UnicodeError, xảy lỗi liên quan đến trình chuyển đổi liệu (kể chuyển đổi code page) TRƯƠNG XUÂN NAM 21 Một số loại ngoại lệ thường gặp Ngoại lệ Lý gây Lớp cha loại cảnh báo, lỗi nhẹ có tiềm xảy tương lai Các lớp lớp gồm: Warning - UserWarning DeprecationWarning PendingDeprecationWarning SyntaxWarning RuntimeWarning FutureWarning ImportWarning UnicodeWarning BytesWarning ResourceWarning TRƯƠNG XUÂN NAM 22 Phần Tự sinh ngoại lệ TRƯƠNG XUÂN NAM 23 Từ khóa raise ▪ Python cung cấp từ khóa raise sử dụng cần phát sinh ngoại lệ ▪ Nếu viết “raise”: cách viết khối except, ta không xử lý ngoại lệ “ném trả” ngoại lệ cho chương trình cha ▪ Nếu viết “raise ”: phát sinh ngoại lệ chứa thông tin báo lỗi ngoại lệ xảy • Trong trường hợp này, nên có kiểu Exception kế thừa từ Exception, kiểu cụ thể cung cấp nhiều thơng tin cho q trình sửa lỗi ▪ Lập trình viên tạo kiểu ngoại lệ mới, kĩ thuật sử dụng hướng đối tượng chủ đề nằm ngồi giảng nên khơng đề cập tới TRƯƠNG XUÂN NAM 24 Ví dụ phát sinh ngoại lệ try: a = int(input("Nhập số nguyên dương nhỏ 100: ")) # sinh lỗi số bé if a = 100: raise ValueError("Bạn cần nhập số nhỏ 100") # bắt lỗi: # - nhập số nguyên # - nhập số lớn # - nhập số bé except ValueError as ex: print(ex) TRƯƠNG XUÂN NAM 25 Phần Bài tập TRƯƠNG XUÂN NAM 26 Bài tập ▪ ▪ ▪ ▪ ▪ TRƯƠNG XUÂN NAM 27 Bài tập ▪ ▪ ▪ ▪ ▪ ▪ TRƯƠNG XUÂN NAM 28 ... bắt lỗi: # - nhập số nguyên # - nhập số lớn # - nhập số bé except ValueError as ex: print(ex) TRƯƠNG XUÂN NAM 25 Phần Bài tập TRƯƠNG XUÂN NAM 26 Bài tập ▪ ▪ ▪ ▪ ▪ TRƯƠNG XUÂN NAM 27 Bài tập ▪... học TRƯƠNG XUÂN NAM Nội dung Ngoại lệ gì? Xử lý ngoại lệ Một số loại ngoại lệ thường gặp Tự sinh ngoại lệ Bài tập TRƯƠNG XUÂN NAM Phần Ngoại lệ gì? TRƯƠNG XUÂN NAM Ngoại lệ gì? ▪ Việc chương trình. .. cung cấp nhiều thơng tin cho q trình sửa lỗi ▪ Lập trình viên tạo kiểu ngoại lệ mới, kĩ thuật sử dụng hướng đối tượng chủ đề nằm giảng nên không đề cập tới TRƯƠNG XUÂN NAM 24 Ví dụ phát sinh ngoại