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 đó
Đào tạo Python trực tiếp
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 ValueErrorChỉ 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
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
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") 7Nế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