Trang tài liệu
Bài tập Python nền tảng
Chương 15: Lỗi và ngoại lệ
Đáp án chương 15: Lỗi và ngoại lệ

Đáp án chương 15: Lỗi và ngoại lệ

Bài Tập 1: Bắt lỗi chia cho 0

Yêu cầu: Viết một chương trình Python để thực hiện phép chia hai số. Sử dụng cấu trúc try-except để bắt lỗi chia cho 0.

Đáp án:

try:
    numerator = float(input("Nhập tử số: "))  # Yêu cầu người dùng nhập tử số
    denominator = float(input("Nhập mẫu số: "))  # Yêu cầu người dùng nhập mẫu số
    result = numerator / denominator  # Thực hiện phép chia
    print(f"Kết quả: {result}")  # In kết quả
except ZeroDivisionError:  # Bắt lỗi chia cho 0
    print("Lỗi: Không thể chia cho 0!")  # Thông báo lỗi nếu mẫu số bằng 0

Bài Tập 2: Bắt lỗi nhập liệu

Yêu cầu: Viết một chương trình Python để yêu cầu người dùng nhập một số. Sử dụng cấu trúc try-except để bắt lỗi khi người dùng nhập vào không phải là số.

Đáp án:

try:
    number = float(input("Nhập một số: "))  # Yêu cầu người dùng nhập một số
    print(f"Số bạn đã nhập là: {number}")  # In ra số vừa nhập
except ValueError:  # Bắt lỗi khi đầu vào không phải là số
    print("Lỗi: Bạn phải nhập một số!")  # Thông báo lỗi

Bài Tập 3: Bắt lỗi chỉ mục không tồn tại

Yêu cầu: Viết một chương trình Python để truy cập một phần tử trong danh sách. Sử dụng try-except để bắt lỗi khi truy cập vào chỉ mục không tồn tại.

Đáp án:

my_list = [1, 2, 3, 4, 5]  # Tạo một danh sách ví dụ
 
try:
    index = int(input("Nhập chỉ mục muốn truy cập: "))  # Yêu cầu người dùng nhập chỉ mục
    print(f"Phần tử tại chỉ mục {index}{my_list[index]}")  # Truy cập phần tử tại chỉ mục đó
except IndexError:  # Bắt lỗi khi chỉ mục không tồn tại
    print("Lỗi: Chỉ mục không tồn tại!")  # Thông báo lỗi

Bài Tập 4: Xử lý nhiều ngoại lệ

Yêu cầu: Viết một chương trình Python có thể bắt nhiều loại lỗi (chia cho 0, nhập liệu sai, chỉ mục không tồn tại) và in ra thông báo lỗi tương ứng.

Đáp án:

try:
    number = int(input("Nhập một số nguyên: "))  # Yêu cầu người dùng nhập một số nguyên
    divisor = int(input("Nhập số chia: "))  # Yêu cầu người dùng nhập số chia
    result = number / divisor  # Thực hiện phép chia
    print(f"Kết quả: {result}")
    index = int(input("Nhập chỉ mục muốn truy cập: "))  # Yêu cầu người dùng nhập chỉ mục
    print(f"Phần tử tại chỉ mục {index}{my_list[index]}")  # Truy cập phần tử tại chỉ mục đó
except ZeroDivisionError:  # Bắt lỗi chia cho 0
    print("Lỗi: Không thể chia cho 0!")  # Thông báo lỗi chia cho 0
except ValueError:  # Bắt lỗi nhập liệu không phải là số
    print("Lỗi: Bạn phải nhập một số nguyên!")  # Thông báo lỗi nhập liệu
except IndexError:  # Bắt lỗi khi chỉ mục không tồn tại
    print("Lỗi: Chỉ mục không tồn tại!")  # Thông báo lỗi chỉ mục

Bài Tập 5: Bắt lỗi và tiếp tục chương trình

Yêu cầu: Viết một chương trình Python để yêu cầu người dùng nhập vào hai số và thực hiện phép chia. Nếu có lỗi xảy ra, chương trình vẫn tiếp tục yêu cầu người dùng nhập liệu.

Đáp án:

while True:  # Vòng lặp để tiếp tục yêu cầu nhập liệu
    try:
        numerator = float(input("Nhập tử số: "))  # Yêu cầu người dùng nhập tử số
        denominator = float(input("Nhập mẫu số: "))  # Yêu cầu người dùng nhập mẫu số
        result = numerator / denominator  # Thực hiện phép chia
        print(f"Kết quả: {result}")
        break  # Thoát khỏi vòng lặp nếu không có lỗi
    except ZeroDivisionError:  # Bắt lỗi chia cho 0
        print("Lỗi: Không thể chia cho 0! Vui lòng thử lại.")  # Thông báo lỗi và yêu cầu nhập lại
    except ValueError:  # Bắt lỗi khi nhập không phải là số
        print("Lỗi: Vui lòng nhập một số hợp lệ.")  # Thông báo lỗi và yêu cầu nhập lại

Bài Tập 6: Sử dụng khối finally

Yêu cầu: Viết một chương trình Python để mở một tệp và đọc nội dung của nó. Sử dụng try-except-finally để đảm bảo rằng tệp luôn được đóng sau khi xử lý, ngay cả khi có lỗi xảy ra.

Đáp án:

try:
    file = open('example.txt', 'r')  # Mở tệp để đọc
    content = file.read()  # Đọc nội dung tệp
    print(content)
except FileNotFoundError:  # Bắt lỗi nếu tệp không tồn tại
    print("Lỗi: Không tìm thấy tệp.")  # Thông báo lỗi
finally:
    file.close()  # Đảm bảo tệp luôn được đóng
    print("Tệp đã được đóng.")  # Thông báo rằng tệp đã đóng

Bài Tập 7: Kiểm tra lỗi có xảy ra hay không

Yêu cầu: Viết một chương trình Python để yêu cầu người dùng nhập vào một số nguyên. Sử dụng try-except-else để kiểm tra xem lỗi có xảy ra hay không và in ra một thông báo thích hợp.

Đáp án:

try:
    number = int(input("Nhập một số nguyên: "))  # Yêu cầu người dùng nhập một số nguyên
except ValueError:  # Bắt lỗi nếu nhập không phải là số nguyên
    print("Lỗi: Đó không phải là một số nguyên!")  # Thông báo lỗi
else:
    print(f"Bạn đã nhập số {number} thành công.")  # Nếu không có lỗi, in thông báo thành công

Bài Tập 8: Tạo ngoại lệ tùy chỉnh đơn giản

Yêu cầu: Viết một ngoại lệ tùy chỉnh tên là NegativeNumberError, được kích hoạt khi người dùng nhập vào một số âm.

Đáp án:

# Tạo ngoại lệ tùy chỉnh kế thừa từ lớp Exception
class NegativeNumberError(Exception):
    pass
 
def check_positive(number):
    if number < 0:  # Kiểm tra nếu số là số âm
        raise NegativeNumberError("Lỗi: Bạn đã nhập một số âm.")  # Kích hoạt ngoại lệ tùy chỉnh
    return number
 
try:
    num = int(input("Nhập một số dương: "))  # Yêu cầu người dùng nhập một số
    check_positive(num)  # Kiểm tra số đó có phải là số dương không
except NegativeNumberError as e:  # Bắt ngoại lệ tùy chỉnh
    print(e)  # In thông báo lỗi

Bài Tập 9: Kích hoạt ngoại lệ tùy chỉnh

Yêu cầu: Viết một chương trình Python để yêu cầu người dùng nhập vào một số dương. Nếu người dùng nhập vào số âm, kích hoạt ngoại lệ NegativeNumberError đã tạo ở bài tập trước.

Đáp án:

try:
    num = int(input("Nhập một số dương: "))  # Yêu cầu người dùng nhập một số
    check_positive(num)  # Kiểm tra số đó có phải là số dương không
except NegativeNumberError as e:  # Bắt ngoại lệ tùy chỉnh
    print(e)  # In thông báo lỗi

Bài Tập 10: Xử lý ngoại lệ tùy chỉnh

Yêu cầu: Sử dụng ngoại lệ NegativeNumberError đã tạo ở bài tập trước, bắt và xử lý ngoại lệ này trong một chương trình Python yêu cầu người dùng nhập một số dương.

Đáp án:

try:
    num = int(input("Nhập một số dương: "))  # Yêu cầu người dùng nhập một số
    check_positive(num)  # Kiểm tra số đó có phải là số dương không
except NegativeNumberError as e:  # Bắt
 
 ngoại lệ tùy chỉnh
    print(f"Đã xảy ra ngoại lệ: {e}")  # In thông báo lỗi
else:
    print(f"Số bạn đã nhập là {num}")  # Nếu không có lỗi, in thông báo thành công

Bài Tập 11: Bắt ngoại lệ từ nhiều chức năng

Yêu cầu: Viết một chương trình Python có nhiều chức năng. Một trong các chức năng này sẽ kích hoạt ngoại lệ (chẳng hạn chia cho 0), và ngoại lệ này cần được bắt ở chức năng khác.

Đáp án:

def divide_numbers(a, b):
    return a / b  # Hàm thực hiện phép chia hai số
 
def process_division():
    try:
        a = float(input("Nhập số thứ nhất: "))  # Yêu cầu người dùng nhập số thứ nhất
        b = float(input("Nhập số thứ hai: "))  # Yêu cầu người dùng nhập số thứ hai
        result = divide_numbers(a, b)  # Thực hiện phép chia
        print(f"Kết quả: {result}")
    except ZeroDivisionError:  # Bắt lỗi chia cho 0
        print("Lỗi: Không thể chia cho 0!")
 
process_division()  # Gọi hàm để thực hiện chương trình

Bài Tập 12: Ngoại lệ và hàm đệ quy

Yêu cầu: Viết một chương trình Python sử dụng hàm đệ quy để tính giai thừa của một số. Sử dụng try-except để xử lý trường hợp người dùng nhập vào một số âm, kích hoạt ngoại lệ tùy chỉnh NegativeNumberError.

Đáp án:

def factorial(n):
    if n < 0:  # Kiểm tra nếu số là số âm
        raise NegativeNumberError("Lỗi: Số âm không có giai thừa.")  # Kích hoạt ngoại lệ tùy chỉnh
    elif n == 0 hoặc n == 1:
        return 1  # Giai thừa của 0 và 1 là 1
    else:
        return n * factorial(n-1)  # Đệ quy tính giai thừa
 
try:
    num = int(input("Nhập một số nguyên không âm: "))  # Yêu cầu người dùng nhập một số nguyên
    result = factorial(num)  # Tính giai thừa
    print(f"Giai thừa của {num}{result}")
except NegativeNumberError as e:  # Bắt ngoại lệ tùy chỉnh
    print(e)  # In thông báo lỗi

Bài Tập 13: Kết hợp ngoại lệ tùy chỉnh với ngoại lệ hệ thống

Yêu cầu: Viết một chương trình Python để yêu cầu người dùng nhập vào hai số. Nếu người dùng nhập vào số âm, kích hoạt ngoại lệ NegativeNumberError. Nếu người dùng nhập sai loại dữ liệu, bắt lỗi ValueError.

Đáp án:

try:
    a = int(input("Nhập số thứ nhất: "))  # Yêu cầu người dùng nhập số thứ nhất
    check_positive(a)  # Kiểm tra số đó có phải là số dương không
    b = int(input("Nhập số thứ hai: "))  # Yêu cầu người dùng nhập số thứ hai
    check_positive(b)  # Kiểm tra số đó có phải là số dương không
    result = a / b  # Thực hiện phép chia
    print(f"Kết quả: {result}")
except NegativeNumberError as e:  # Bắt ngoại lệ tùy chỉnh
    print(e)  # In thông báo lỗi
except ValueError:  # Bắt lỗi khi nhập không phải là số nguyên
    print("Lỗi: Bạn phải nhập một số nguyên!")  # Thông báo lỗi

Bài Tập 14: Bắt và xử lý ngoại lệ lồng nhau

Yêu cầu: Viết một chương trình Python để bắt và xử lý ngoại lệ lồng nhau, chẳng hạn như ngoại lệ xảy ra bên trong một ngoại lệ khác.

Đáp án:

try:
    try:
        num = int(input("Nhập một số: "))  # Yêu cầu người dùng nhập một số
        result = 10 / num  # Thực hiện phép chia
    except ZeroDivisionError:  # Bắt lỗi chia cho 0
        print("Lỗi: Không thể chia cho 0!")
        raise  # Kích hoạt lại ngoại lệ
except Exception as e:  # Bắt mọi ngoại lệ khác
    print(f"Một lỗi đã xảy ra: {e}")  # In thông báo lỗi

Bài Tập 15: Ghi log ngoại lệ

Yêu cầu: Viết một chương trình Python để bắt ngoại lệ và ghi log lỗi vào một tệp log.

Đáp án:

import logging  # Nhập thư viện logging
 
logging.basicConfig(filename='error.log', level=logging.ERROR)  # Thiết lập cấu hình ghi log
 
try:
    num = int(input("Nhập một số: "))  # Yêu cầu người dùng nhập một số
    result = 10 / num  # Thực hiện phép chia
except Exception as e:  # Bắt mọi ngoại lệ
    logging.error(f"Đã xảy ra lỗi: {e}")  # Ghi lỗi vào tệp log
    print("Đã ghi lỗi vào tệp log.")  # Thông báo lỗi đã được ghi

Bài Tập 16: Tạo một ứng dụng nhỏ với nhiều ngoại lệ

Yêu cầu: Viết một chương trình Python giả lập một máy tính đơn giản với các phép toán cộng, trừ, nhân, chia. Xử lý các ngoại lệ như chia cho 0, nhập sai loại dữ liệu, và ngoại lệ tùy chỉnh cho trường hợp nhập số âm.

Đáp án:

def calculator():
    try:
        a = float(input("Nhập số thứ nhất: "))  # Yêu cầu người dùng nhập số thứ nhất
        b = float(input("Nhập số thứ hai: "))  # Yêu cầu người dùng nhập số thứ hai
        operation = input("Chọn phép toán (+, -, *, /): ")  # Yêu cầu chọn phép toán
 
        if operation == '+':
            result = a + b  # Thực hiện phép cộng
        elif operation == '-':
            result = a - b  # Thực hiện phép trừ
        elif operation == '*':
            result = a * b  # Thực hiện phép nhân
        elif operation == '/':
            result = a / b  # Thực hiện phép chia
        else:
            print("Phép toán không hợp lệ.")
            return
 
        print(f"Kết quả: {result}")
 
    except ZeroDivisionError:  # Bắt lỗi chia cho 0
        print("Lỗi: Không thể chia cho 0!")
    except ValueError:  # Bắt lỗi khi nhập không phải là số
        print("Lỗi: Vui lòng nhập số hợp lệ.")
    except NegativeNumberError as e:  # Bắt ngoại lệ tùy chỉnh
        print(e)  # In thông báo lỗi
 
calculator()  # Gọi hàm để thực hiện chương trình

Bài Tập 17: Tạo một hệ thống đăng nhập với ngoại lệ

Yêu cầu: Viết một chương trình Python mô phỏng hệ thống đăng nhập. Nếu người dùng nhập sai mật khẩu quá 3 lần, kích hoạt một ngoại lệ tùy chỉnh LoginFailedError.

Đáp án:

class LoginFailedError(Exception):  # Tạo ngoại lệ tùy chỉnh cho lỗi đăng nhập
    pass
 
def login_system():
    correct_password = "python123"  # Mật khẩu đúng
    attempts = 0
 
    while attempts < 3:  # Giới hạn số lần thử
        password = input("Nhập mật khẩu: ")  # Yêu cầu người dùng nhập mật khẩu
        if password == correct_password:  # Kiểm tra mật khẩu đúng hay không
            print("Đăng nhập thành công!")  # Thông báo đăng nhập thành công
            return
        else:
            print("Mật khẩu sai!")  # Thông báo mật khẩu sai
            attempts += 1  # Tăng số lần thử
 
    raise LoginFailedError("Lỗi: Bạn đã nhập sai mật khẩu quá 3 lần.")  # Kích hoạt ngoại lệ sau 3 lần thử
 
try:
    login_system()  # Gọi hàm đăng nhập
except LoginFailedError as e:  # Bắt ngoại lệ đăng nhập
    print(e)  # In thông báo lỗi

Bài Tập 18: Tạo một thư viện xử lý ngoại lệ

Yêu cầu: Viết một thư viện Python chứa nhiều loại ngoại lệ tùy chỉnh và các hàm xử lý ngoại lệ cho các tình huống khác nhau, chẳng hạn như xử lý lỗi kết nối, lỗi cơ sở dữ liệu, lỗi tệp tin.

Đáp án:

# custom_exceptions.py
 
# Tạo các ngoại lệ tùy chỉnh cho các tình huống khác nhau
class ConnectionError(Exception):
    pass
 
class DatabaseError(Exception):
    pass
 
class FileNotFoundErrorCustom(Exception):
    pass
 
def connect_to_server(server):
    if server != "localhost":  # Kiểm
 
 tra nếu server không phải localhost
        raise ConnectionError("Không thể kết nối tới server.")  # Kích hoạt ngoại lệ kết nối
 
def access_database(db):
    if db != "my_database":  # Kiểm tra nếu cơ sở dữ liệu không phải my_database
        raise DatabaseError("Lỗi cơ sở dữ liệu.")  # Kích hoạt ngoại lệ cơ sở dữ liệu
 
def open_file(file):
    if file != "example.txt":  # Kiểm tra nếu tệp không phải example.txt
        raise FileNotFoundErrorCustom("Tệp không tồn tại.")  # Kích hoạt ngoại lệ tệp không tìm thấy
 
# main.py
from custom_exceptions import *  # Import các ngoại lệ tùy chỉnh từ file custom_exceptions
 
try:
    connect_to_server("remote_server")  # Thử kết nối tới server
except ConnectionError as e:  # Bắt lỗi kết nối
    print(e)  # In thông báo lỗi
 
try:
    access_database("unknown_db")  # Thử truy cập cơ sở dữ liệu
except DatabaseError as e:  # Bắt lỗi cơ sở dữ liệu
    print(e)  # In thông báo lỗi
 
try:
    open_file("non_existent_file.txt")  # Thử mở một tệp không tồn tại
except FileNotFoundErrorCustom as e:  # Bắt lỗi tệp không tìm thấy
    print(e)  # In thông báo lỗi