Python xử lý ngoại lệ như thế nào?

Một ngoại lệ là một lỗi xảy ra trong quá trình thực hiện chương trình. Các ngoại lệ được biết đến với những người không phải là lập trình viên như các trường hợp không tuân theo quy tắc chung. Cái tên "ngoại lệ" trong khoa học máy tính cũng có ý nghĩa này. Nó ngụ ý rằng vấn đề (ngoại lệ) không xảy ra thường xuyên, tôi. e. ngoại lệ là "ngoại lệ đối với quy tắc". Xử lý ngoại lệ là một cấu trúc trong một số ngôn ngữ lập trình để tự động xử lý hoặc xử lý lỗi. Nhiều ngôn ngữ lập trình như C++, Objective-C, PHP, Java, Ruby, Python và nhiều ngôn ngữ khác có hỗ trợ tích hợp để xử lý ngoại lệ

Xử lý lỗi thường được giải quyết bằng cách lưu trạng thái thực thi tại thời điểm xảy ra lỗi và làm gián đoạn luồng bình thường của chương trình để thực thi một chức năng hoặc đoạn mã đặc biệt, được gọi là trình xử lý ngoại lệ. Tùy thuộc vào loại lỗi ("chia cho 0", "lỗi mở tệp", v.v.) đã xảy ra, trình xử lý lỗi có thể "khắc phục" sự cố và chương trình có thể được tiếp tục sau đó với dữ liệu đã lưu trước đó

Python xử lý ngoại lệ như thế nào?

Đào tạo Python trực tiếp

Python xử lý ngoại lệ như thế nào?

Thưởng thức trang này?

Thấy. Tổng quan về các khóa học Python trực tiếp

đăng ký tại đây

Xử lý ngoại lệ trong Python

Xử lý ngoại lệ trong Python rất giống với Java. Đoạn mã có nguy cơ xảy ra ngoại lệ, được nhúng trong khối thử. Trong khi trong Java, các ngoại lệ được bắt bởi các mệnh đề bắt, trong Python, chúng tôi có các câu lệnh được giới thiệu bởi một từ khóa "ngoại trừ". Có thể tạo ngoại lệ "tùy chỉnh". Với câu lệnh nâng cao, có thể buộc một ngoại lệ được chỉ định xảy ra

Hãy xem một ví dụ đơn giản. Giả sử chúng ta muốn yêu cầu người dùng nhập một số nguyên. Nếu chúng ta sử dụng một input(), đầu vào sẽ là một chuỗi, mà chúng ta phải truyền thành một số nguyên. Nếu đầu vào không phải là một số nguyên hợp lệ, chúng tôi sẽ tạo (tăng) một ValueError. Chúng tôi hiển thị điều này trong phiên tương tác sau đây

n = int(input("Please enter a number: "))

Với sự trợ giúp của xử lý ngoại lệ, chúng ta có thể viết mã mạnh mẽ để đọc một số nguyên từ đầu vào

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")

Đó là một vòng lặp, chỉ ngắt nếu một số nguyên hợp lệ đã được cung cấp. Vòng lặp while được nhập. Mã trong mệnh đề try sẽ được thực thi theo từng câu lệnh. Nếu không có ngoại lệ nào xảy ra trong quá trình thực thi, thì quá trình thực thi sẽ đến câu lệnh break và vòng lặp while sẽ bị bỏ lại. Nếu một ngoại lệ xảy ra, tôi. e. trong quá trình truyền n, phần còn lại của khối thử sẽ bị bỏ qua và mệnh đề ngoại trừ sẽ được thực thi. Lỗi nêu ra, trong trường hợp của chúng tôi là ValueError, phải khớp với một trong các tên sau except. Trong ví dụ của chúng tôi chỉ có một, tôi. e. "Lỗi giá trị. ". Sau khi in văn bản của câu lệnh in, quá trình thực thi thực hiện một vòng lặp khác. Nó bắt đầu với một đầu vào mới()

Chúng ta có thể biến đoạn mã trên thành một hàm, có thể được sử dụng để có đầu vào rõ ràng

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")

Chúng tôi sử dụng điều này với ví dụ về tuổi chó của chúng tôi từ chương Câu lệnh có điều kiện

def dog2human_age(dog_age):
    human_age = -1
    if dog_age < 0:
        human_age = -1
    elif dog_age == 0:
        human_age = 0
    elif dog_age == 1:
        human_age = 14
    elif dog_age == 2:
        human_age = 22
    else:
        human_age = 22 + (dog_age -2) * 5
    return human_age

age = int_input("Age of your dog? ")
print("Age of the dog: ", dog2human_age(age))

ĐẦU RA

Not a proper integer! Try it again
Not a proper integer! Try it again
Age of the dog:  37

Nhiều mệnh đề ngoại trừ

Một câu lệnh try có thể có nhiều hơn một mệnh đề except cho các trường hợp ngoại lệ khác nhau. Nhưng nhiều nhất một mệnh đề ngoại trừ sẽ được thực thi

Ví dụ tiếp theo của chúng tôi hiển thị một mệnh đề try, trong đó chúng tôi mở một tệp để đọc, đọc một dòng từ tệp này và chuyển đổi dòng này thành một số nguyên. Có ít nhất hai trường hợp ngoại lệ có thể xảy ra

an IOError
ValueError

Chỉ trong trường hợp chúng tôi có một điều khoản ngoại trừ không tên bổ sung cho một lỗi không mong muốn

import sys

try:
    f = open('integers.txt')
    s = f.readline()
    i = int(s.strip())
except IOError as e:
    errno, strerror = e.args
    print("I/O error({0}): {1}".format(errno,strerror))
    # e can be printed directly without using .args:
    # print(e)
except ValueError:
    print("No valid integer in line.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

ĐẦU RA

________số 8_______

Việc xử lý IOError trong ví dụ trước được quan tâm đặc biệt. Mệnh đề ngoại trừ cho IOError chỉ định một biến "e" sau tên ngoại lệ (IOError). Biến "e" được liên kết với một thể hiện ngoại lệ với các đối số được lưu trữ trong thể hiện. tranh luận. Nếu chúng ta gọi tập lệnh trên bằng một tệp không tồn tại, chúng ta sẽ nhận được thông báo

Lỗi vào/ra(2). Không có tập tin hoặc thư mục

Và nếu số nguyên tập tin. txt không đọc được e. g. nếu chúng tôi không có quyền đọc nó, chúng tôi sẽ nhận được thông báo sau

Lỗi vào/ra(13). Quyền bị từ chối

Một mệnh đề ngoại trừ có thể đặt tên nhiều hơn một ngoại lệ trong một bộ tên lỗi, như chúng ta thấy trong ví dụ sau

try:
    f = open('integers.txt')
    s = f.readline()
    i = int(s.strip())
except (IOError, ValueError):
    print("An I/O error or a ValueError occurred")
except:
    print("An unexpected error occurred")
    raise

ĐẦU RA

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
0

Bây giờ chúng ta muốn chứng minh điều gì sẽ xảy ra nếu chúng ta gọi một hàm trong khối try và nếu một ngoại lệ xảy ra bên trong lệnh gọi hàm

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
1

ĐẦU RA

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
2

chức năng bắt ngoại lệ

Bây giờ chúng ta sẽ mở rộng ví dụ của mình để hàm sẽ bắt ngoại lệ trực tiếp

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
3

ĐẦU RA

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
4

Như chúng ta đã dự đoán, ngoại lệ được bắt bên trong hàm chứ không phải ngoại lệ của người gọi

Bây giờ, chúng tôi thêm một "tăng", tạo lại ValueError, để ngoại lệ sẽ được truyền đến người gọi

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
5

ĐẦU RA

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
6

Đào tạo Python trực tiếp

Python xử lý ngoại lệ như thế nào?

Thưởng thức trang này?

Thấy. Tổng quan về các khóa học Python trực tiếp

Các khóa học trực tuyến sắp tới

Khái niệm cơ bản về Python cho người mới bắt đầu

Khóa học nâng cao chuyên sâu

Python dành cho kỹ sư và nhà khoa học

Lập trình hướng đối tượng với Python

đăng ký tại đây

Ngoại lệ tùy chỉnh

Có thể tự tạo Ngoại lệ

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
7

ĐẦU RA

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
8

Cách tốt nhất hoặc cách Pythonic để làm điều này, bao gồm việc xác định một lớp ngoại lệ kế thừa từ lớp Ngoại lệ. Bạn sẽ phải xem qua chương về Lập trình hướng đối tượng để hiểu đầy đủ ví dụ sau

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
9

ĐẦU RA

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
0

Hành động dọn dẹp (thử. cuối cùng)

Cho đến nay, câu lệnh try luôn được ghép nối với các mệnh đề ngoại trừ. Nhưng cũng có một cách khác để sử dụng nó. Câu lệnh try có thể được theo sau bởi một mệnh đề cuối cùng. Các mệnh đề cuối cùng được gọi là mệnh đề dọn dẹp hoặc chấm dứt, bởi vì chúng phải được thực hiện trong mọi trường hợp, i. e. mệnh đề "cuối cùng" luôn được thực thi bất kể có ngoại lệ xảy ra trong khối thử hay không. Một ví dụ đơn giản để chứng minh mệnh đề cuối cùng

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
1

ĐẦU RA

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
2

Đào tạo Python trực tiếp

Python xử lý ngoại lệ như thế nào?

Thưởng thức trang này?

Thấy. Tổng quan về các khóa học Python trực tiếp

đăng ký tại đây

Kết hợp thử, ngoại trừ và cuối cùng

"cuối cùng" và "ngoại trừ" có thể được sử dụng cùng nhau cho cùng một khối thử, như có thể thấy trong ví dụ Python sau

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
3

ĐẦU RA

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
4

mệnh đề khác

Sự cố gắng. câu lệnh ngoại trừ có một mệnh đề khác tùy chọn. Một khối khác phải được định vị sau tất cả các mệnh đề ngoại trừ. Một mệnh đề khác sẽ được thực thi nếu mệnh đề try không đưa ra một ngoại lệ

Ví dụ sau mở một tệp và đọc tất cả các dòng vào một danh sách có tên là "văn bản"

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
5

ĐẦU RA

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
6

Ví dụ này nhận tên tệp thông qua đối số dòng lệnh. Vì vậy, hãy chắc chắn rằng bạn gọi nó đúng cách. Giả sử rằng bạn đã lưu chương trình này dưới dạng "Exception_test. py". Trong trường hợp này, bạn phải gọi nó bằng

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
7

Nếu bạn không muốn hành vi này, chỉ cần thay đổi dòng "file_name = sys. argv[1]" thành "file_name = 'số nguyên. txt'"

Ví dụ trước gần giống như

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
8

ĐẦU RA

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")
6

Sự khác biệt chính là trong trường hợp đầu tiên, tất cả các câu lệnh của khối thử có thể dẫn đến cùng một thông báo lỗi "không thể mở. ", đó là sai, nếu fh. đóng() hoặc fh. readlines() gây ra lỗi

Python xử lý nhiều ngoại lệ như thế nào?

Bằng cách xử lý nhiều ngoại lệ, một chương trình có thể phản hồi các ngoại lệ khác nhau mà không chấm dứt nó. Trong Python, các khối ngoại lệ thử có thể được sử dụng để bắt và phản hồi một hoặc nhiều ngoại lệ . Trong trường hợp một quy trình phát sinh nhiều ngoại lệ có thể xảy ra, tất cả chúng có thể được xử lý bằng một mệnh đề ngoại trừ duy nhất.

Python có hỗ trợ xử lý ngoại lệ không?

Trong Python, bạn có thể đưa ra một ngoại lệ trong chương trình bằng cách sử dụng phương pháp nâng cao ngoại lệ. Đưa ra một ngoại lệ giúp bạn phá vỡ quá trình thực thi mã hiện tại và trả lại ngoại lệ cho đến khi nó được xử lý