Python dainganxanh
  • Lời nói đầu
  • Chương I. SƠ LƯỢC
    • Bài 1. Cài đặt môi trường
    • Bài 2. Từ khóa và định danh
    • Bài 3. Câu lệnh, khối lệnh và chú thích
    • Bài 4. Nhập, xuất dữ liệu
    • Bài 5. Toán tử và lệnh gán
    • Bài 6. Biến, Hằng
    • Bài 7. Kiểu dữ liệu
    • Bài 8. Thao tác với tệp (cơ bản)
    • Bài 9. Tổng quan về Python
    • Bài tập chương 1
  • Chương II. RẼ NHÁNH - LẶP
    • Bài 10. Cấu trúc rẽ nhánh if…else
    • Bài 11. Cấu trúc lặp với for
    • Bài 12. Cấu trúc lặp với while
    • Bài 13. Lệnh break và continue
    • Bài tập chương 2
  • Chương III. HÀM & MODULE
    • Bài 14. Hàm
    • Bài 15. Tham số hàm
    • Bài 16. Đệ quy
    • Bài 17. Hàm ẩn danh
    • Bài 18. Biến toàn cục và cục bộ
    • Bài 19. Module
    • Bài 20. Package
  • Chương IV. KIỂU DỮ LIỆU
    • Bài 21. Dữ liệu kiểu số
    • Bài 22. Dữ liệu kiểu string
    • Bài 23. Dữ liệu kiểu list
    • Bài 24. Dữ liệu kiểu tuple
    • Bài 25. Dữ liệu kiểu set
    • Bài 26. Dữ liệu kiểu dictionary
  • Chương V. TỆP & THƯ MỤC
    • Bài 27. Đọc và ghi file
    • Bài 28. Quản lý file và folder
  • Chương VI. LỖI & NGOẠI LỆ
    • Bài 29. Ngoại lệ
    • Bài 30. Xử lý ngoại lệ
    • Bài 31. Xây dựng ngoại lệ
  • Chương VII. HƯỚNG ĐỐI TƯỢNG
    • Bài 32. Lập trình hướng đối tượng
    • Bài 33. Đối tượng và Lớp
    • Bài 34. Kế thừa
    • Bài 35. Đa kế thừa
    • Bài 36. Nạp chồng toán tử
  • Chương VIII. NGÀY - GIỜ
    • Python datetime
    • Python strftime()
    • Python strptime()
    • Current date and time
    • Get Current time
    • Timestamp to datetime
    • Python time Module
    • Python sleep()
  • Chương IX. CHỦ ĐỀ NÂNG CAO
    • Python Iterators
    • Python Generators
    • Python Closures
    • Python Decorators
    • Python @property decorator
    • Python RegEx
    • Python Examples
  • PHỤ LỤC - GHI CHÉP
    • Hàm map()
    • Cài Sublime Text để code Python
    • Ghi chép - ghi chú
    • Mảng 2 chiều
    • Công thức với dãy số
  • Tài liệu tham khảo
  • www.dainganxanh.com
  • 🐍Khóa học Python
  • 🤷‍♀️Hỏi đáp, chia sẻ (FG)
  • 🎮Sinh Test chấm Themis
Powered by GitBook
On this page
  • Ví dụ 1
  • Ví dụ 2
  • Tùy chỉnh lớp ngoại lệ (Exception Classes)

Was this helpful?

  1. Chương VI. LỖI & NGOẠI LỆ

Bài 31. Xây dựng ngoại lệ

Ngoại lệ do người dùng tự định nghĩa

Trong lập trình Python, các ngoại lệ phát sinh khi lỗi logic. Ta cũng có thể sinh các ngoại lệ theo cách thủ công bằng cách sử dụng từ khóa raise.

Hãy xét một số ví dụ dưới đây và thực hành xây dựng ngoại lệ

Ví dụ 1

Chương trình yêu cầu nhập một số thỏa điều kiện, lặp đến khi nào người dùng nhập đúng mới thôi.

while True:
    try:
        x = int(input('Nhập một số nguyên trong khoảng 1-10: '))
        if x<1 or x>10:
            raise Exception
        print(f'Bạn vừa nhập một số hợp lệ: x = {x}')
        break
    except:
        print('Số vừa nhập ngoài khoảng cho phép. Nhập lại nhé!')
while True:
    try:
        a = int(input("Nhập số nguyên dương: "))
        if a <= 0:
                raise ValueError("Đó không phải là số nguyên dương!")
        else: break
    except ValueError as ex:
            print(ex)

print(f'Thực hiện các thao tác với {a}')

Ví dụ 2

Trò chơi đoán số. Chương trình sẽ sinh ngẫu nhiên một số trong khoảng 1 đến 99. Người chơi nhập số từ bàn phím đến khi trùng với số được sinh ngẫu nhiên trước đó. Khi đoán đúng, chương trình sẽ thông báo chúc mừng và đưa ra số lần đã đoán.

class Loi(Exception):
    """Lớp cơ sở cho những ngoại lệ khác"""
    pass

class SoNhoQua(Loi):
    """Phát sinh khi số nhập vào nhỏ quá"""
    pass

class SoLonQua(Loi):
    """Phát sinh khi số nhập vào lớn quá"""
    pass

# Sinh ngẫu nhiên một số nguyên
import random as rd
number = rd.randint(1,100)

# nhập số đoán
landoan = 0
while True:
    try:
        n = int(input("Nhập vào số nguyên: "))
        landoan +=1
        if n < number:
            raise SoNhoQua
        elif n > number:
            raise SoLonQua
        break
    except SoNhoQua:
        print("Số này chưa đủ lớn - nhập lại nhé!")
        print()
    except SoLonQua:
        print("Số này lớn quá, thử lại xem!")
        print()

print(f"Xin chúc mừng! Bạn đã đoán chính xác trong {landoan} lần đoán.")

Tùy chỉnh lớp ngoại lệ (Exception Classes)

Phần này liên quan đến lớp (class) thuộc kiến thức lập trình hướng đối tượng. Ta có xem qua ví dụ và sẽ trở lại tìm hiểu sau khi học về Lớp trong lập trình hướng đối tượng ở chương sau .

Ví dụ

class LuongKhongHopLe(Exception):
    """Ngoại lệ này pháp sinh khi có lỗi nhập liệu.

    Attributes:
        luong -- số liệu nhập vào có thể phát sinh lỗi
        thongbao -- giải thích lỗi
    """

    def __init__(self, luong, thongbao='''Lương nhập vào 
                        ngoài khoảng (5000, 15000)'''):
        self.luong = luong
        self.thongbao = thongbao
        super().__init__(self.thongbao)


luong = int(input("Nhập lương: "))
if not 5000 < luong < 15000:
    raise LuongKhongHopLe(luong)
class LuongKhongHopLe(Exception):
    """Exception raised for errors in the input luong.

    Attributes:
        luong -- input luong which caused the error
        thongbao -- explanation of the error
    """

    def __init__(self, luong, thongbao="Lương không trong khoảng (5000, 15000)"):
        self.luong = luong
        self.thongbao = thongbao
        super().__init__(self.thongbao)

    def __str__(self):
        return f'{self.luong} -> {self.thongbao}'


luong = int(input("Nhập số lương: "))
if not 5000 < luong < 15000:
    raise LuongKhongHopLe(luong)
PreviousBài 30. Xử lý ngoại lệNextChương VII. HƯỚNG ĐỐI TƯỢNG

Last updated 4 years ago

Was this helpful?