Cộng đồng chia sẻ tri thức Lib24.vn

Python - Xử lý ngoại lệ

Gửi bởi: Phạm Thọ Thái Dương 19 tháng 2 2020 lúc 16:28:51


Mục lục
* * * * *

Python cung cấp hai tính năng rất quan trọng để xử lý bất kỳ lỗi không mong muốn nào trong các chương trình Python của bạn và để thêm khả năng sửa lỗi trong chúng -

  1. Xử lý ngoại lệ - Điều này sẽ được đề cập trong hướng dẫn này. Dưới đây là danh sách Ngoại lệ tiêu chuẩn có sẵn trong Python: Ngoại lệ chuẩn .
  2. Assertions - Điều này sẽ được đề cập trong Assertions trong hướng dẫn Python .

Danh sách các trường hợp ngoại lệ tiêu chuẩn -

Các xác nhận trong Python

Một xác nhận là kiểm tra sự tỉnh táo rằng bạn có thể bật hoặc tắt khi bạn hoàn thành việc kiểm tra chương trình.

Cách dễ nhất để nghĩ về một khẳng định là so sánh nó với một câu lệnh if-if (hoặc chính xác hơn, một câu lệnh tăng-nếu-không). Một biểu thức được kiểm tra và nếu kết quả đưa ra sai, một ngoại lệ được đưa ra.

Các xác nhận được thực hiện bởi câu lệnh khẳng định, từ khóa mới nhất cho Python, được giới thiệu trong phiên bản 1.5.

Các lập trình viên thường đặt các xác nhận khi bắt đầu một hàm để kiểm tra đầu vào hợp lệ và sau khi gọi hàm để kiểm tra đầu ra hợp lệ.

Các khẳng định Tuyên bố

Khi nó gặp một câu lệnh khẳng định, Python đánh giá biểu thức đi kèm, điều này hy vọng là đúng. Nếu biểu thức là sai, Python sẽ tạo ra ngoại lệ AssertsError .

Các cú pháp cho khẳng định là -

assert Expression[, Arguments]

Nếu xác nhận thất bại, Python sử dụng ArgumentExpression làm đối số cho AssertsError. Các ngoại lệ của AssertsError có thể được bắt và xử lý như bất kỳ ngoại lệ nào khác bằng cách sử dụng câu lệnh ngoại trừ thử, nhưng nếu không được xử lý, chúng sẽ chấm dứt chương trình và tạo ra một dấu vết.

Thí dụ

Đây là một chức năng chuyển đổi nhiệt độ từ độ Kelvin sang độ Fahrenheit. Vì không độ Kelvin lạnh như vậy, nên chức năng sẽ thoát ra nếu thấy nhiệt độ âm -

Bản thử trực tiếp

#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
   assert (Temperature >= 0),"Colder than absolute zero!"
   return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!

Ngoại lệ là gì?

Một ngoại lệ là một sự kiện, xảy ra trong quá trình thực thi chương trình làm gián đoạn dòng chảy thông thường của hướng dẫn của chương trình. Nói chung, khi một kịch bản Python gặp phải một tình huống mà nó không thể đối phó được, nó sẽ đưa ra một ngoại lệ. Một ngoại lệ là một đối tượng Python đại diện cho một lỗi.

Khi một tập lệnh Python đưa ra một ngoại lệ, nó phải xử lý ngoại lệ ngay lập tức nếu không nó sẽ chấm dứt và thoát.

Xử lý một ngoại lệ

Nếu bạn có một số mã đáng ngờ có thể gây ra ngoại lệ, bạn có thể bảo vệ chương trình của mình bằng cách đặt mã đáng ngờ vào một khối try : . Sau khối try:, bao gồm một câu lệnh trừ: theo sau là một khối mã xử lý vấn đề một cách thanh lịch nhất có thể.

Cú pháp

Đây là cú pháp đơn giản của thử .... ngoại trừ ... các khối khác -

try:
   You do your operations here;
   ......................
except ExceptionI:
   If there is ExceptionI, then execute this block.
except ExceptionII:
   If there is ExceptionII, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Dưới đây là một vài điểm quan trọng về cú pháp được đề cập ở trên -

  1. Một câu lệnh thử có thể có nhiều câu trừ trừ câu lệnh. Điều này hữu ích khi khối thử chứa các câu lệnh có thể đưa ra các loại ngoại lệ khác nhau.
  2. Bạn cũng có thể cung cấp một mệnh đề ngoại trừ chung, xử lý bất kỳ ngoại lệ nào.
  3. Sau mệnh đề ngoại trừ, bạn có thể bao gồm một mệnh đề khác. Mã trong khối khác thực thi nếu mã trong khối try: không đưa ra ngoại lệ.
  4. Khối khác là một nơi tốt cho mã không cần sự bảo vệ của try: block.

Thí dụ

Ví dụ này mở một tệp, ghi nội dung trong tệp, và xuất hiện một cách duyên dáng vì không có vấn đề gì cả -

Bản thử trực tiếp

#!/usr/bin/python

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print "Error: can\'t find file or read data"
else:
   print "Written content in the file successfully"
   fh.close()

Điều này tạo ra kết quả sau -

Written content in the file successfully

Thí dụ

Ví dụ này cố gắng mở một tệp mà bạn không có quyền ghi, vì vậy nó sẽ tạo ra một ngoại lệ -

Bản thử trực tiếp

#!/usr/bin/python

try:
   fh = open("testfile", "r")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print "Error: can\'t find file or read data"
else:
   print "Written content in the file successfully"

Điều này tạo ra kết quả sau -

Error: can't find file or read data

Các ngoại trừ khoản không có ngoại lệ

Bạn cũng có thể sử dụng câu lệnh ngoại trừ không có ngoại lệ được xác định như sau -

try:
   You do your operations here;
   ......................
except:
   If there is any exception, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Đây là một loại tuyên bố ngoại trừ thử bắt tất cả các ngoại lệ xảy ra. Mặc dù vậy, sử dụng loại câu lệnh ngoại trừ thử này không được coi là một thực tiễn lập trình tốt, bởi vì nó nắm bắt được tất cả các ngoại lệ nhưng không làm cho lập trình viên xác định nguyên nhân gốc rễ của vấn đề có thể xảy ra.

Các ngoại trừ khoản với nhiều trường hợp ngoại lệ

Bạn cũng có thể sử dụng cùng một câu lệnh ngoại trừ để xử lý nhiều trường hợp ngoại lệ như sau -

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Điều khoản cuối cùng thử

Bạn có thể sử dụng khối cuối cùng: cùng với khối try : . Khối cuối cùng là nơi đặt bất kỳ mã nào phải thực thi, cho dù khối thử có đưa ra ngoại lệ hay không. Cú pháp của câu lệnh try-cuối cùng là thế này -

try:
   You do your operations here;
   ......................
   Due to any exception, this may be skipped.
finally:
   This would always be executed.
   ......................

Bạn không thể sử dụng mệnh đề khác cùng với mệnh đề cuối cùng.

Thí dụ

Bản thử trực tiếp

#!/usr/bin/python

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
finally:
   print "Error: can\'t find file or read data"

Nếu bạn không có quyền mở tệp ở chế độ ghi, thì điều này sẽ tạo ra kết quả sau -

Error: can't find file or read data

Ví dụ tương tự có thể được viết sạch hơn như sau -

Bản thử trực tiếp

#!/usr/bin/python

try:
   fh = open("testfile", "w")
   try:
      fh.write("This is my test file for exception handling!!")
   finally:
      print "Going to close the file"
      fh.close()
except IOError:
   print "Error: can\'t find file or read data"

Khi một ngoại lệ được ném vào khối thử , việc thực thi ngay lập tức chuyển sang khối cuối cùng . Sau khi tất cả các câu lệnh trong khối cuối cùng được thực thi, ngoại lệ được đưa ra một lần nữa và được xử lý trong các câu lệnh ngoại trừ nếu có trong lớp cao hơn tiếp theo của câu lệnh ngoại trừ thử .

Luận cứ về một ngoại lệ

Một ngoại lệ có thể có một đối số , đó là một giá trị cung cấp thêm thông tin về vấn đề. Nội dung của các đối số khác nhau bởi ngoại lệ. Bạn nắm bắt đối số của một ngoại lệ bằng cách cung cấp một biến trong mệnh đề ngoại trừ như sau -

try:
   You do your operations here;
   ......................
except ExceptionType, Argument:
   You can print value of Argument here...

Nếu bạn viết mã để xử lý một ngoại lệ duy nhất, bạn có thể có một biến theo tên của ngoại lệ trong câu lệnh ngoại trừ. Nếu bạn đang bẫy nhiều ngoại lệ, bạn có thể có một biến theo sau bộ ngoại lệ.

Biến này nhận giá trị của ngoại lệ chủ yếu chứa nguyên nhân của ngoại lệ. Biến có thể nhận một giá trị đơn hoặc nhiều giá trị dưới dạng một tuple. Bộ dữ liệu này thường chứa chuỗi lỗi, số lỗi và vị trí lỗi.

Thí dụ

Sau đây là một ví dụ cho một ngoại lệ duy nhất -

Bản thử trực tiếp

#!/usr/bin/python

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError, Argument:
      print "The argument does not contain numbers\n", Argument

# Call above function here.
temp_convert("xyz");

Điều này tạo ra kết quả sau -

The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'

Tăng một ngoại lệ

Bạn có thể đưa ra các ngoại lệ theo nhiều cách bằng cách sử dụng câu lệnh nâng. Cú pháp chung cho tuyên bố tăng như sau.

Cú pháp

raise [Exception [, args [, traceback]]]

Ở đây, Exception là loại ngoại lệ (ví dụ NameError) và đối số là một giá trị cho đối số ngoại lệ. Đối số là tùy chọn; nếu không được cung cấp, đối số ngoại lệ là Không có.

Đối số cuối cùng, truy nguyên, cũng là tùy chọn (và hiếm khi được sử dụng trong thực tế) và nếu có, là đối tượng truy nguyên được sử dụng cho ngoại lệ.

Thí dụ

Một ngoại lệ có thể là một chuỗi, một lớp hoặc một đối tượng. Hầu hết các trường hợp ngoại lệ mà lõi Python tăng là các lớp, với một đối số là một thể hiện của lớp. Xác định các ngoại lệ mới khá dễ dàng và có thể được thực hiện như sau -

def functionName( level ):
   if level < 1:
      raise "Invalid level!", level
      # The code below to this would not be executed
      # if we raise the exception

Lưu ý: Để bắt ngoại lệ, mệnh đề "ngoại trừ" phải tham chiếu đến cùng một ngoại lệ được ném vào đối tượng lớp hoặc chuỗi đơn giản. Ví dụ: để nắm bắt ngoại lệ trên, chúng ta phải viết mệnh đề ngoại trừ như sau -

try:
   Business Logic here...
except "Invalid level!":
   Exception handling here...
else:
   Rest of the code here...

Trường hợp ngoại lệ do người dùng xác định

Python cũng cho phép bạn tạo các ngoại lệ của riêng mình bằng cách lấy các lớp từ các ngoại lệ tích hợp sẵn tiêu chuẩn.

Dưới đây là một ví dụ liên quan đến RuntimeError . Ở đây, một lớp được tạo ra được phân lớp từ RuntimeError . Điều này hữu ích khi bạn cần hiển thị thông tin cụ thể hơn khi bắt gặp một ngoại lệ.

Trong khối thử, ngoại lệ do người dùng xác định được nêu ra và bị bắt trong khối ngoại trừ. Biến e được sử dụng để tạo một thể hiện của lớp Networkerror .

class Networkerror(RuntimeError):
   def __init__(self, arg):
      self.args = arg

Vì vậy, một khi bạn đã xác định lớp trên, bạn có thể đưa ra ngoại lệ như sau -

try:
   raise Networkerror("Bad hostname")
except Networkerror,e:
   print e.args

Được cập nhật: 25 tháng 4 lúc 0:56:01 | Lượt xem: 450