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.
whileTrue:try: x =int(input('Nhập một số nguyên trong khoảng 1-10: '))if x<1or x>10:raiseExceptionprint(f'Bạn vừa nhập một số hợp lệ: x = {x}')breakexcept:print('Số vừa nhập ngoài khoảng cho phép. Nhập lại nhé!')
whileTrue:try: a =int(input("Nhập số nguyên dương: "))if a <=0:raiseValueError("Đó không phải là số nguyên dương!")else:breakexceptValueErroras 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.
classLoi(Exception):"""Lớp cơ sở cho những ngoại lệ khác"""passclassSoNhoQua(Loi):"""Phát sinh khi số nhập vào nhỏ quá"""passclassSoLonQua(Loi):"""Phát sinh khi số nhập vào lớn quá"""pass# Sinh ngẫu nhiên một số nguyênimport random as rdnumber = rd.randint(1,100)# nhập số đoánlandoan =0whileTrue:try: n =int(input("Nhập vào số nguyên: ")) landoan +=1if n < number:raise SoNhoQuaelif n > number:raise SoLonQuabreakexcept 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ụ
classLuongKhongHopLe(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 = thongbaosuper().__init__(self.thongbao)luong =int(input("Nhập lương: "))ifnot5000< luong <15000:raiseLuongKhongHopLe(luong)
classLuongKhongHopLe(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 = thongbaosuper().__init__(self.thongbao)def__str__(self):returnf'{self.luong} -> {self.thongbao}'luong =int(input("Nhập số lương: "))ifnot5000< luong <15000:raiseLuongKhongHopLe(luong)