Có hai loại Error trong Python, đó là Syntax errors (lỗi cú pháp) và Exceptions (ngoại lệ). Errors là các vấn đề bên trong một chương trình, làm cho chương trình dừng thực thi. Mặt khác thì các exceptions (ngoại lệ) cũng sẽ được đưa ra khi một số sự kiện nội bộ (internal events) xảy ra, làm thay đổi luồng hoạt động bình thường của chương trình.

1. Sự khác nhau giữa Syntax Error và Exeptions

Syntax Error (lỗi cú pháp): Như chính cái tên của nó, lỗi này xuất hiện do có cú pháp sai ở bên trong code. Lỗi syntax error sẽ khiến cho chương trình dừng hoạt động.

Ví dụ:

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------


# initialize the amount variable 
amount = 10000
  
# check that You are eligible to 
#  purchase Dsa Self Paced or not 
if(amount>2999) 
    print("You are eligible to purchase Dsa Self Paced") 

Kết quả in ra là:

Exceptions (ngoại lệ): Các exceptions sẽ được đưa ra khi chương trình đúng về mặt cú pháp nhưng việc thực thi code dẫn đến một lỗi nào đó. Lỗi này sẽ không khiến chương trình bị dừng hoạt động, tuy nhiên, nó sẽ làm cho luồng hoạt động bình thường của chương trình bị thay đổi.

Ví dụ:


# initialize the amount variable 
marks = 10000
  
# perform division with 0 
a = marks / 0
print(a) 

Kết quả in ra là:

Trong ví dụ trên, ngoại lệ ZeroDivisionError đã được kích hoạt do chúng ta đang cố gắng chia một số cho 0.

Lưu ý: class Exception chính là base class (lớp cha) của tất cả các exceptions (ngoại lệ) tromg Python. Bạn có thể xem hệ thống phân cấp kế thừa của Exception trong Python ở đây

2. Xứ lý ngoại lệ bằng Try và Except

Chúng ta sẽ thử truy cập đến một phần tử của mảng có index nằm ngoài phạm vi mảng, và xử lý ngoại lệ tương ứng, trong ví dụ sau đây:

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------

# Python program to handle simple runtime error 
  
a = [1, 2, 3] 
try:  
    print "Second element = %d" %(a[1]) 
  
    # Throws error since there are only 3 elements in array 
    print "Fourth element = %d" %(a[3])  
  
except IndexError: 
    print "An error occurred"

Kết quả in ra là:

Second element = 2
An error occurred

Một câu lệnh try có thể có nhiều hơn một mệnh đề except, để chỉ định các handlers (xử lý) dành cho các exceptions khác nhau. Cần lưu ý rằng, nhiều nhất một handler sẽ được thự thi. Dưới đây là đoạn chương trình ví dụ, xử lý nhiều errors (lỗi) bằng một câu lệnh except:


# Program to handle multiple errors with one except statement 
try :  
    a = 3
    if a < 4 : 
  
        # throws ZeroDivisionError for a = 3  
        b = a/(a-3) 
      
    # throws NameError if a >= 4 
    print "Value of b = ", b 
  
# note that braces () are necessary here for multiple exceptions 
except(ZeroDivisionError, NameError): 
    print "\nError Occurred and Handled"

Kết quả in ra là:

Error Occurred and Handled

Nếu bạn thay đổi giá trị của ‘a’ thành một giá trị lớn hơn hoặc bằng 4, output sẽ là:

Value of b =  
Error Occurred and Handled

Sở dĩ thu được kết quả output phía trên là bởi vì ngay sau khi Python cố gắng truy cập đến giá trị của b, thì ngoại lệ NameError sẽ xảy ra.

3. Mệnh đề Else

Trong Python, bạn cũng có thể sử dụng mệnh đề else trên khối lệnh try-except, mệnh đề else nên được đặt ở sau tất cả các mệnh đề except. Chương trình sẽ chỉ chạy vào khối lệnh else khi mệnh đề try không kích hoạt bất cứ exception nào. Dưới đây là đoạn chương trình mô tả cách sử dụng mệnh đề else với khối lệnh try-except:


# Program to depict else clause with try-except 
  
# Function which returns a/b 
def AbyB(a , b): 
    try: 
        c = ((a+b) / (a-b)) 
    except ZeroDivisionError: 
        print "a/b result in 0"
    else: 
        print c 
  
# Driver program to test above function 
AbyB(2.0, 3.0) 
AbyB(3.0, 3.0) 

Kết quả của đoạn chương trình ví dụ trên là:

-5.0
a/b result in 0

4. Từ khóa Finally trong Python

Python có cung cấp từ khóa finally, cái mà sẽ luôn luôn được thực thi sau khối lệnh try và except. Khối lệnh finally sẽ luôn luôn thực thi sau khi khối lệnh try kết thúc một cách bình thường, hoặc sau khi khối lệnh try bị chấm dứt thực thi do một số ngoại lệ được kích hoạt.

Cú pháp để sử dụng từ khóa finally:

try:
       # Some Code.... 

except:
       # optional block
       # Handling of exception (if required)

else:
       # execute if no exception

finally:
      # Some code .....(always executed)

Sau đây là đoạn chương trình ví dụ mô tả cách sử dụng từ khóa finally:

# Python program to demonstrate finally  
    
# No exception Exception raised in try block  
try:  
    k = 5//0 # raises divide by zero exception.  
    print(k)  
    
# handles zerodivision exception      
except ZeroDivisionError:     
    print("Can't divide by zero")  
        
finally:  
    # this block is always executed   
    # regardless of exception generation.  
    print('This is always executed') 

Kết quả in ra là:

Can't divide by zero
This is always executed

5. Đưa ra một ngoại lệ

Câu lệnh raise sẽ cho phép lập trình viên buộc một ngoại lệ cụ thể phải xảy ra. Đối số duy nhất được sử dụng trong câu lệnh raise sẽ chỉ ra cái exception (ngoại lệ) nào được kích hoạt. Đối số đó phải là một exception instance (một thể hiện của lớp exception nào đó) hoặc là một exception class (một class mà kế thừa từ class Exception). Đoạn chương trình bên dưới đây sẽ mô tả cách sử dụng câu lệnh raise để đưa ra một exception (ngoại lệ):


# Program to depict Raising Exception 
  
try:  
    raise NameError("Hi there")  # Raise Error 
except NameError: 
    print "An exception"
    raise  # To determine whether the exception was raised or not 

Kết quả của đoạn chương trình trên sẽ là dòng chữ đơn giản được in ra là “An exception”, nhưng một lỗi Runtime error cũng sẽ xảy ra vào lúc cuối, do câu lệnh raise ở dòng cuối cùng. Vì vậy, kết quả in ra trong command line của bạn sẽ trông giống như sau:

Traceback (most recent call last):
  File "003dff3d748c75816b7f849be98b91b8.py", line 4, in 
    raise NameError("Hi there") # Raise Error
NameError: Hi there

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!