Menu
CoddyTech

Xử lý lỗi

Bài học 11 trên 29 trong khóa học Dự án máy tính bằng Python của Coddy.

Hiện tại, eval chưa xử lý đầu vào không hợp lệ. Các lỗi có thể xảy ra:

  • Đầu vào không phải là danh sách.
  • Kích thước danh sách không đúng, chỉ chấp nhận kích thước 2 và 3.
challenge icon

Thử thách

Dễ

Thêm xử lý ngoại lệ cho các lỗi trên.

Một số ví dụ về thông báo lỗi khi gọi hàm:

  • eval('not a list')  ->  Failed to evaluate "not a list"
  • eval([])  ->  Failed to evaluate "[]"
  • eval(['+', 2, 3, 4])  ->  Failed to evaluate "['+', 2, 3, 4]"
  • eval(5)  ->  Failed to evaluate "5"

Tự làm thử

def calc(op, n1, n2=None):
    if not isinstance(n1, int) and not isinstance(n1, float):
        raise Exception('Invalid number "' + str(n1) + '"')

    if n2 is None:
        if op == '+' or op == 'add':
            return n1
        if op == '-' or op == 'sub':
            return -n1

        raise Exception('Invalid operator "' + op + '"')

    if not isinstance(n2, int) and not isinstance(n2, float):
        raise Exception('Invalid number "' + str(n2) + '"')

    if op == '+' or op == 'add':
        return n1 + n2
    if op == '-' or op == 'sub':
        return n1 - n2
    if op == '*' or op == 'mul':
        return n1 * n2
    if op == '/' or op == 'div':
        if n2 == 0:
            raise Exception("Division by zero")
        return n1 / n2
    if op == '%' or op == 'mod':
        if n2 == 0:
            raise Exception("Division by zero")
        return n1 % n2
    if op == '^' or op == 'pow':
        return n1 ** n2

    raise Exception('Invalid operator "' + op + '"')


def eval(lst):
    if len(lst) == 2:
        op = lst[0]
        n = lst[1]
        if not isinstance(n, list):
            return calc(op, n)

        if isinstance(n, list):
            n = eval(n)

        return calc(op, n)
    elif len(lst) == 3:
        op = lst[0]
        n1 = lst[1]
        n2 = lst[2]
        if not isinstance(n1, list) and not isinstance(n2, list):
            return calc(op, n1, n2)
        
        if isinstance(n1, list):
            n1 = eval(n1)
        if isinstance(n2, list):
            n2 = eval(n2)

        return calc(op, n1, n2)

Tất cả bài học trong Dự án máy tính bằng Python

Tự luyện tập: Trình biên dịch Python online