Python 3 - Xử lý ngoại lệ
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 gỡ lỗi trong chúng -
Exception Handling- Điều này sẽ được đề cập trong hướng dẫn này. Đây là danh sách các Ngoại lệ tiêu chuẩn có sẵn trong Python - Ngoại lệ Tiêu chuẩn .
Assertions- Điều này sẽ được đề cập trong hướng dẫn Assertions in Python 3 .
Ngoại lệ tiêu chuẩn
Đây là danh sách các Ngoại lệ Tiêu chuẩn có sẵn trong Python. -
Sr.No. | Tên ngoại lệ & Mô tả |
---|---|
1 | Exception Lớp cơ sở cho tất cả các trường hợp ngoại lệ |
2 | StopIteration Được nâng lên khi phương thức next () của một trình lặp không trỏ đến bất kỳ đối tượng nào. |
3 | SystemExit Được nâng lên bởi hàm sys.exit (). |
4 | StandardError Lớp cơ sở cho tất cả các ngoại lệ được tích hợp sẵn ngoại trừ StopIteration và SystemExit. |
5 | ArithmeticError Lớp cơ sở cho tất cả các lỗi xảy ra cho phép tính số. |
6 | OverflowError Được nâng lên khi một phép tính vượt quá giới hạn tối đa cho một kiểu số. |
7 | FloatingPointError Tăng lên khi một phép tính dấu phẩy động không thành công. |
số 8 | ZeroDivisonError Tăng lên khi phép chia hoặc môđun cho 0 diễn ra đối với tất cả các kiểu số. |
9 | AssertionError Nâng cao trong trường hợp không thành công của câu lệnh Assert. |
10 | AttributeError Được nâng lên trong trường hợp tham chiếu hoặc gán thuộc tính không thành công. |
11 | EOFError Tăng lên khi không có đầu vào từ hàm raw_input () hoặc input () và đến cuối tệp. |
12 | ImportError Tăng lên khi một câu lệnh nhập không thành công. |
13 | KeyboardInterrupt Tăng lên khi người dùng làm gián đoạn việc thực thi chương trình, thường bằng cách nhấn Ctrl + c. |
14 | LookupError Lớp cơ sở cho tất cả các lỗi tra cứu. |
15 | IndexError Tăng lên khi không tìm thấy chỉ mục trong một chuỗi. |
16 | KeyError Được nâng lên khi không tìm thấy khóa được chỉ định trong từ điển. |
17 | NameError Được nâng lên khi không tìm thấy mã định danh trong không gian tên cục bộ hoặc toàn cầu. |
18 | UnboundLocalError Được nâng lên khi cố gắng truy cập một biến cục bộ trong một hàm hoặc phương thức nhưng không có giá trị nào được gán cho nó. |
19 | EnvironmentError Lớp cơ sở cho tất cả các ngoại lệ xảy ra bên ngoài môi trường Python. |
20 | IOError Tăng lên khi thao tác nhập / xuất không thành công, chẳng hạn như câu lệnh in hoặc hàm open () khi cố gắng mở một tệp không tồn tại. |
21 | OSError Tăng các lỗi liên quan đến hệ điều hành. |
22 | SyntaxError Nâng lên khi có lỗi trong cú pháp Python. |
23 | IndentationError Tăng lên khi thụt lề không được chỉ định đúng cách. |
24 | SystemError Tăng lên khi trình thông dịch tìm thấy sự cố nội bộ, nhưng khi gặp lỗi này, trình thông dịch Python không thoát. |
25 | SystemExit Tăng lên khi trình thông dịch Python bị thoát bằng cách sử dụng hàm sys.exit (). Nếu không được xử lý trong mã, trình thông dịch sẽ thoát. |
26 | TypeError Được nâng lên khi một hoạt động hoặc chức năng được thực hiện không hợp lệ đối với kiểu dữ liệu được chỉ định. |
27 | ValueError Được nâng lên khi hàm dựng sẵn cho một kiểu dữ liệu có kiểu đối số hợp lệ, nhưng các đối số có giá trị không hợp lệ được chỉ định. |
28 | RuntimeError Tăng lên khi lỗi được tạo ra không thuộc bất kỳ loại nào. |
29 | NotImplementedError Được nâng lên khi một phương thức trừu tượng cần được triển khai trong một lớp kế thừa không thực sự được triển khai. |
Khẳng định bằng Python
Xác nhận là một kiểm tra sự tỉnh táo mà bạn có thể bật hoặc tắt khi hoàn tất quá trình kiểm tra chương trình của mình.
Cách dễ nhất để nghĩ về một khẳng định là ví nó với một raise-ifcâu lệnh (hay chính xác hơn là câu lệnh raise-if-not). Một biểu thức được kiểm tra và nếu kết quả trả về sai, một ngoại lệ sẽ được đưa ra.
Khẳng định được thực hiện bởi câu lệnh khẳng định, từ khóa mới nhất của 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 ở đầu một hàm để kiểm tra đầu vào hợp lệ và sau một lệnh gọi hàm để kiểm tra đầu ra hợp lệ.
Tuyên bố khẳng định
Khi gặp câu lệnh khẳng định, Python sẽ đá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ẽ đưa ra một ngoại lệ AssertionError .
Cú pháp để khẳng định là -
assert Expression[, Arguments]
Nếu xác nhận không thành công, Python sử dụng ArgumentExpression làm đối số cho AssertionError. Các ngoại lệ AssertionError có thể được bắt và xử lý giống như bất kỳ ngoại lệ nào khác, bằng cách sử dụng câu lệnh try-exception. Nếu chúng không được xử lý, chúng sẽ chấm dứt chương trình và tạo ra một truy nguyên.
Thí dụ
Đây là một chức năng chuyển đổi nhiệt độ nhất định từ độ Kelvin sang độ F. Vì 0 ° K càng lạnh càng lạnh, nên hàm sẽ tắt nếu thấy nhiệt độ âm -
#!/usr/bin/python3
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!
Exception là gì?
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 luồng hướng dẫn bình thường của chương trình. Nói chung, khi một tập lệnh Python gặp một tình huống mà nó không thể đối phó, nó sẽ tạo 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 tạo 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ẽ kết thúc và thoát.
Xử lý một ngoại lệ
Nếu bạn có một số mã đáng ngờ có thể tạo ra một 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àotry:khối. Sau khi thử: khối, bao gồm mộtexcept: , theo sau là một khối mã xử lý vấn đề một cách tinh tế nhất có thể.
Cú pháp
Đây là cú pháp đơn giản của khối try .... ngoại trừ ... 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 số điểm quan trọng về cú pháp được đề cập ở trên -
Một câu lệnh try duy nhất có thể có nhiều câu lệnh ngoại trừ. Điều này hữu ích khi khối try chứa các câu lệnh có thể ném các loại ngoại lệ khác nhau.
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.
Sau (các) mệnh đề ngoại trừ, bạn có thể thêm một mệnh đề khác. Mã trong khối else thực thi nếu mã trong khối try: không tạo ra ngoại lệ.
Khối khác là một nơi tốt cho mã không cần sự bảo vệ của khối try:.
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ì -
#!/usr/bin/python3
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ó tạo ra một ngoại lệ -
#!/usr/bin/python3
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
Điều khoản ngoại trừ 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 định nghĩa 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.
Loại này của một try-exceptcâu lệnh bắt tất cả các ngoại lệ xảy ra. Mặc dù vậy, việc sử dụng loại câu lệnh thử ngoại trừ này không được coi là một phương pháp lập trình tốt vì nó bắt được tất cả các trường hợp ngoại lệ nhưng không làm cho lập trình viên xác định được nguyên nhân gốc rễ của vấn đề có thể xảy ra.
Mệnh đề ngoại trừ với nhiều 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 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.
Mệnh đề thử cuối cùng
Bạn có thể sử dụng một finally: khối cùng với một try:khối. Cácfinally:khối là nơi đặt bất kỳ mã nào phải thực thi, cho dù khối thử có nêu ra ngoại lệ hay không. Cú pháp của câu lệnh try-last là:
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
Note- Bạn có thể cung cấp (các) mệnh đề ngoại trừ hoặc mệnh đề cuối cùng, nhưng không cung cấp cả hai. Bạn cũng không thể sử dụng mệnh đề else cùng với mệnh đề cuối cùng.
Thí dụ
#!/usr/bin/python3
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")
fh.close()
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 rõ ràng hơn như sau:
#!/usr/bin/python3
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")
Điều này tạo ra kết quả sau:
Going to close the file
Khi một ngoại lệ được ném vào khối try , việc thực thi ngay lập tức được chuyển đến 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ệ sẽ đượ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 try- exception .
Lập luận 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ông tin bổ sung về vấn đề. Nội dung của đối số khác nhau tùy theo 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 as 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 sau 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ị duy nhất hoặc nhiều giá trị dưới dạng một bộ giá trị. Tuple 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 -
#!/usr/bin/python3
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError as 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'
Nâng cao một ngoại lệ
Bạn có thể nêu ra các ngoại lệ theo một số cách bằng cách sử dụng câu lệnh tăng. Cú pháp chung choraise tuyên bố như sau:
Cú pháp
raise [Exception [, args [, traceback]]]
Ở đây, Exception là loại ngoại lệ (ví dụ: NameError) và đối số là 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, traceback, 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 theo dõi đượ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 ngoại lệ mà lõi Python nêu ra là các lớp, với một đối số là một thể hiện của lớp. Việc 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 Exception(level)
# The code below to this would not be executed
# if we raise the exception
return level
Note- Để bắt một ngoại lệ, một mệnh đề "ngoại trừ" phải tham chiếu đến cùng một ngoại lệ được ném ra dưới dạng một đối tượng lớp hoặc một 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 Exception as e:
Exception handling here using e.args...
else:
Rest of the code here...
Ví dụ sau minh họa việc sử dụng nâng cao một ngoại lệ:
#!/usr/bin/python3
def functionName( level ):
if level <1:
raise Exception(level)
# The code below to this would not be executed
# if we raise the exception
return level
try:
l = functionName(-10)
print ("level = ",l)
except Exception as e:
print ("error in level argument",e.args[0])
Điều này sẽ tạo ra kết quả sau
error in level argument -10
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 dẫn xuất các lớp từ các ngoại lệ được tích hợp sẵn tiêu chuẩn.
Đâ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 rất hữu ích khi bạn cần hiển thị thông tin cụ thể hơn khi bắt được một ngoại lệ.
Trong khối try, ngoại lệ do người dùng xác định được nâng lên và bị mắc vào 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, khi bạn đã xác định lớp trên, bạn có thể nâng cao ngoại lệ như sau:
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args