Hướng dẫn dùng c try python

Hàm try() được sử dụng trong việc xử lý lỗi và ngoại lệ trong Python

Có hai kiểu lỗi:

– Syntax Error: Còn được gọi là Parsing Errors (lỗi phân tích cú pháp), là loại lỗi cơ bản nhất, được đưa ra khi Python parser (trình phân tích cú pháp của Python) không thể hiểu được một dòng code cụ thể nào đó.

– Exception: Là những lỗi mà được phát hiện trong khi chương trình đang thực thi, ví dụ như lỗi ZeroDivisionError – Lỗi chia cho 0.

Danh sách các Exception Errors – các lỗi ngoại lệ:

– IOError: Nếu file không thể được mở ra

– KeyboardInterrupt: Khi người dùng nhấn vào một phím không được yêu cầu

– ValueError: Khi built-in function (hàm được tích hợp sẵn  trong Python) nhận được một đối số sai (wrong argument)

– EOFError: Nếu đọc được ký tự End-Of-File (tức là ký tự kết thúc file) mà trước đó không đọc được bất cứ dữ liệu nào.

– ImportError: Nếu không thể tìm được module đang được import vào chương trình.

Tiếp theo, chúng ta sẽ tìm hiểu về cách để xử lý các lỗi này bên trong code Python của mình. Ở đây, chúng ta sẽ cần tới cặp câu lệnh try-except.

Cú pháp cơ bản:

Basic Syntax : 
 try:
    // Code
 except:
    // Code

Hàm try() hoạt động như thế nào?

– Đầu tiên, câu lệnh try đầu tiên sẽ được thực thi, tức là phần code nằm giữa mệnh đề try và mệnh đề except sẽ được thực thi đầu tiên.

– Nếu không có ngoại lệ nào được đưa ra, thì chỉ có mệnh đề try sẽ chạy, còn mệnh đề except sẽ không chạy mà đi vào trạng thái finished (đã hoàn thành) luôn.

– Nếu có bất kỳ ngoại lệ nào xuất hiện, mệnh đề try sẽ được bỏ qua, và mệnh đề except sẽ chạy.

– Nếu có bất kỳ ngoại lệ nào xuất hiện, nhưng mệnh đề except bên trong code không xử lý nó, thì nó sẽ được truyền lại lên trên cho mệnh đề try ở bên ngoài. Nếu ngoại lệ vẫn không được xử lý, thì chương trình sẽ dừng thực thi.

– Một câu lệnh try có thể đi kèm với nhiều hơn một mệnh đề except.

Ví dụ 1: Không có ngoại lệ xuất hiện, mệnh đề try sẽ chạy

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: 
#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 code to illustrate 
# working of try()  
def divide(x, y): 
    try: 
        # Floor Division : Gives only Fractional Part as Answer 
        result = x // y 
        print("Yeah ! Your answer is :", result) 
    except ZeroDivisionError: 
        print("Sorry ! You are dividing by zero ") 
  
# Look at parameters and note the working of Program 
divide(3, 2) 

– Kết quả in ra là:

('Yeah ! Your answer is :', 1)

Ví dụ 2: Có một ngoại lệ, vì vậy chỉ có mệnh đề except sẽ chạy


# Python code to illustrate 
# working of try()  
def divide(x, y): 
    try: 
        # Floor Division : Gives only Fractional Part as Answer 
        result = x // y 
        print("Yeah ! Your answer is :", result) 
    except ZeroDivisionError: 
        print("Sorry ! You are dividing by zero ") 
  
# Look at parameters and note the working of Program 
divide(3, 0) 

– Kết quả in ra là:

Sorry ! You are dividing by zero

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

  • w3school
  • python.org
  • geeksforgeeks

Tài liệu từ cafedev:

  • Full series tự học Python từ cơ bản tới nâng cao tại đây nha.
  • Ebook về python tại đây.
  • Các series tự học lập trình khác

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:

  • Group Facebook
  • Fanpage
  • Youtube
  • Instagram
  • Twitter
  • Linkedin
  • Pinterest
  • Trang chủ

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!

Hàm try() được sử dụng trong việc xử lý lỗi và ngoại lệ trong Python

Nội dung chính

  • 1- Exception là gì?
  • 2- Sơ đồ phân cấp
  • 3- Bắt ngoại lệ thông qua try-except
  • 4- Khối try-except-finally
  • 5- Ném tiếp ngoại lệ
  • 6- Gói một Exception trong một Exception khác

Có hai kiểu lỗi:

– Syntax Error: Còn được gọi là Parsing Errors (lỗi phân tích cú pháp), là loại lỗi cơ bản nhất, được đưa ra khi Python parser (trình phân tích cú pháp của Python) không thể hiểu được một dòng code cụ thể nào đó.

– Exception: Là những lỗi mà được phát hiện trong khi chương trình đang thực thi, ví dụ như lỗi ZeroDivisionError – Lỗi chia cho 0.

Danh sách các Exception Errors – các lỗi ngoại lệ:

– IOError: Nếu file không thể được mở ra

– KeyboardInterrupt: Khi người dùng nhấn vào một phím không được yêu cầu

– ValueError: Khi built-in function (hàm được tích hợp sẵn  trong Python) nhận được một đối số sai (wrong argument)

– EOFError: Nếu đọc được ký tự End-Of-File (tức là ký tự kết thúc file) mà trước đó không đọc được bất cứ dữ liệu nào.

– ImportError: Nếu không thể tìm được module đang được import vào chương trình.

Tiếp theo, chúng ta sẽ tìm hiểu về cách để xử lý các lỗi này bên trong code Python của mình. Ở đây, chúng ta sẽ cần tới cặp câu lệnh try-except.

Cú pháp cơ bản:

Basic Syntax : 
 try:
    // Code
 except:
    // Code

Hàm try() hoạt động như thế nào?

– Đầu tiên, câu lệnh try đầu tiên sẽ được thực thi, tức là phần code nằm giữa mệnh đề try và mệnh đề except sẽ được thực thi đầu tiên.

– Nếu không có ngoại lệ nào được đưa ra, thì chỉ có mệnh đề try sẽ chạy, còn mệnh đề except sẽ không chạy mà đi vào trạng thái finished (đã hoàn thành) luôn.

– Nếu có bất kỳ ngoại lệ nào xuất hiện, mệnh đề try sẽ được bỏ qua, và mệnh đề except sẽ chạy.

– Nếu có bất kỳ ngoại lệ nào xuất hiện, nhưng mệnh đề except bên trong code không xử lý nó, thì nó sẽ được truyền lại lên trên cho mệnh đề try ở bên ngoài. Nếu ngoại lệ vẫn không được xử lý, thì chương trình sẽ dừng thực thi.

– Một câu lệnh try có thể đi kèm với nhiều hơn một mệnh đề except.

Ví dụ 1: Không có ngoại lệ xuất hiện, mệnh đề try sẽ chạy

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: 
#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 code to illustrate 
# working of try()  
def divide(x, y): 
    try: 
        # Floor Division : Gives only Fractional Part as Answer 
        result = x // y 
        print("Yeah ! Your answer is :", result) 
    except ZeroDivisionError: 
        print("Sorry ! You are dividing by zero ") 
  
# Look at parameters and note the working of Program 
divide(3, 2) 

– Kết quả in ra là:

('Yeah ! Your answer is :', 1)

Ví dụ 2: Có một ngoại lệ, vì vậy chỉ có mệnh đề except sẽ chạy


# Python code to illustrate 
# working of try()  
def divide(x, y): 
    try: 
        # Floor Division : Gives only Fractional Part as Answer 
        result = x // y 
        print("Yeah ! Your answer is :", result) 
    except ZeroDivisionError: 
        print("Sorry ! You are dividing by zero ") 
  
# Look at parameters and note the working of Program 
divide(3, 0) 

– Kết quả in ra là:

Sorry ! You are dividing by zero

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

  • w3school
  • python.org
  • geeksforgeeks

Tài liệu từ cafedev:

  • Full series tự học Python từ cơ bản tới nâng cao tại đây nha.
  • Ebook về python tại đây.
  • Các series tự học lập trình khác

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:

  • Group Facebook
  • Fanpage
  • Youtube
  • Instagram
  • Twitter
  • Linkedin
  • Pinterest
  • Trang chủ

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!

Nhóm phát triển của chúng tôi vừa ra mắt website langlearning.net học tiếng Anh, Nga, Đức, Pháp, Việt, Trung, Hàn, Nhật, ... miễn phí cho tất cả mọi người.
Là một website được viết trên công nghệ web Flutter vì vậy hỗ trợ rất tốt cho người học, kể cả những người học khó tính nhất.
Hiện tại website đang tiếp tục được cập nhập nội dung cho phong phú và đầy đủ hơn. Mong các bạn nghé thăm và ủng hộ website mới của chúng tôi.

Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới.

Facebook

1- Exception là gì?

Trước hết chúng ta hãy xem một ví dụ minh họa sau:
Trong ví dụ này có một đoạn code lỗi nguyên nhân do phép chia cho 0. Việc chia cho 0 gây ra ngoại lệ: ZeroDivisionError

helloExceptionExample.py


print ("Three")

# Phép chia này không vấn đề.
value = 10 / 2 
print ("Two")

# Phép chia này không vấn đề.
value = 10 / 1 
print ("One")

d = 0

# Phép chia này có vấn đề, cho cho 0
# Một lỗi được phát ra tại đây.
value = 10 / d

# Dòng mã dưới đây sẽ không được thực thi.
print ("Let's go!")

Kết quả chạy ví dụ:
Bạn có thể thấy thông báo lỗi trên màn hình Console, thông báo lỗi rất rõ ràng, xẩy ra ở dòng thứ mấy trên code.

Hãy xem luồng đi của chương trình qua hình minh họa dưới đây.

  • Chương trình đã chạy hoàn toàn bình thường từ các bước (1),(2) cho tới (6)
  • Bước thứ (7) xẩy ra vấn đề khi chia cho 0. Chương trình kết thúc.
  • Đoạn mã bước (8) đã không được thực hiện.

Chúng ta sẽ sửa code của ví dụ trên.

helloCatchException.py


print ("Three")

value = 10 / 2

print ("Two")

value = 10 / 1
 
print ("One")

d = 0 

try :
    # Phép chia này có vấn đề, chia cho 0.
    # Một lỗi được phát ra tại đây (ZeroDivisionError).
    value = 10 / d 
    print ("value = ", value) 
except ZeroDivisionError as e : 
    print ("Error: ", str(e) )
    print ("Ignore to continue ...") 

print ("Let's go!")

Và kết quả chạy ví dụ:


Three
Two
One
Error division by zero
Ignore to coninue ...
Let's go!

Chúng ta sẽ giải thích bằng hình minh họa dưới đây về luồng đi của chương trình.

  • Các bước (1)-(6) hoàn toàn bình thường.
  • Ngoại lệ xẩy ra tại bước (7), vấn đề chia cho 0.
  • Lập tức nó nhẩy vào thực thi lệnh trong khối except, bước (8) bị bỏ qua.
  • Bước (9), (10) được thực hiện.
  • Bước (11) được thực hiện.

2- Sơ đồ phân cấp

Đây là mô hình sơ đồ phân cấp của các ngoại lệ trong Python.

  • Lớp ở mức cao nhất là BaseException
  • Các lớp con trực tiếp là ExceptionKeyboardInterrupt, ..

Các Exception sẵn có của Python thông thường được bắt nguồn (derived) từ BaseException (Mở rộng từ BaseException). Trong khi đó các exception của người dùng (lập trình viên) nên thừa kế từ lớp Exception hoặc từ các lớp con của nó.

3- Bắt ngoại lệ thông qua try-except

Chúng ta viết một lớp exception thừa kế từ lớp Exception.

Xem thêm:

Hàm checkAge để kiểm tra tuổi, nếu tuổi nhỏ hơn 18 hoặc lớn hơn 40 một ngoại lệ sẽ được ném ra.

ageexception.py


# Python 3.x 
class AgeException(Exception): 
    def __init__(self, msg, age ):
        super().__init__(msg) 
        self.age = age 
        
class TooYoungException(AgeException): 
    def __init__(self, msg, age):
        super().__init__(msg, age)     

class TooOldException(AgeException): 
    def __init__(self, msg, age):
        super().__init__(msg, age)    
         
# Hàm kiểm tra tuổi, nó có thể ném ra ngoại lệ. 
def checkAge(age): 
    if (age < 18) :
        # Nếu tuổi nhỏ hơn 18, một ngoại lệ sẽ bị ném ra.
        # Hàm sẽ bị kết thúc tại đây.
        raise TooYoungException("Age " + str(age) + " too young", age) 
    elif (age > 40) :
        # Nếu tuổi lớn hơn 40, một ngoại lệ sẽ bị ném ra
        # Hàm sẽ bị kết thúc tại đây.        
        raise TooOldException("Age " +  str(age) + " too old", age); 
    # Nếu tuổi nằm trong khoảng 18-40.
    # Đoạn code này sẽ được thực thi. 
    print ("Age " +  str(age) + " OK!");

Ví dụ:

tryExceptDemo1.py


import ageexception
from ageexception import AgeException
from ageexception import TooYoungException
from ageexception import TooOldException

print ("Start Recruiting ...")
age = 11
print ("Check your Age ", age)
try : 
    ageexception.checkAge(age)
    print ("You pass!")  
except TooYoungException as e  : 
    print("You are too young, not pass!")    
    print("Cause message: ", str(e) )
    print("Invalid age: ", e.age) 
except  TooOldException as e : 
    print ("You are too old, not pass!")
    print ("Cause message: ", str(e) )
    print("Invalid age: ", e.age)

Chạy ví dụ:


Start Recruiting ...
Check you Age 11
You are too young, not pass!
Cause message: Age 11 too young
Invalid age: 11

Ví dụ dưới đây, chúng ta sẽ gộp bắt các ngoại lệ thông qua ngoại lệ ở cấp cao hơn. Ở cấp cao hơn nó sẽ bắt được ngoại lệ đó và tất cả các ngoại lệ con.

tryExceptDemo2.py


import ageexception
from ageexception import AgeException
from ageexception import TooYoungException
from ageexception import TooOldException

print ("Start Recruiting ...")
age = 51 
print ("Check your Age ", age)
try : 
    ageexception.checkAge(age)
    print ("You pass!") 
except AgeException as e  : 
    print("You are not pass!")  
    print("type(e): ", type(e) )
    print("Cause message: ", str(e) )
    print("Invalid age: ", e.age)

Output:


Start Recruiting ...
Check you Age 51
You are not pass!
type(e): <class 'ageexceptioon.TooOldException'>
Cause message: Age 51 too old
Invalid age: 51

4- Khối try-except-finally

Trên kia chúng ta đã làm quen với việc bắt ngoại lệ thông qua khối try-except. Việc xử lý ngoại lệ đầy đủ là try-except-finally. Khối finally luôn được thực thi bất kể ngoại lệ có xẩy ra tại khối try hay không.

try - except - finally


try : 
    # Làm gì đó tại đây.
except Exception1 as e : 
    # Làm gì đó tại đây.
except Exception2 as e : 
    # Làm gì đó tại đây.
finally : 
    # Khối finally luôn luôn được thực thi.
    # Làm gì đó tại đây.

Ví dụ:

tryExceptFinallyDemo.py


def toInteger(text) : 
    try :  
        print ("-- Begin parse text: ", text) 
        # Một ngoại lệ có thể bị ném ra tại đây (ValueError).
        value = int(text) 
        return value 
    except ValueError as e : 
        # Trường hợp 'text' không là một số.
        # Khối 'except' sẽ được thực thi.          
        print ("ValueError message: ", str(e))
        print ("type(e): ", type(e)) 
        # Trả về 0 nếu xuất hiện lỗi ValueError.
        return 0  
    finally :  
        print ("-- End parse text: " + text)  
 
text = "001234A2" 
value = toInteger(text) 
print ("Value= ", value)

Chạy ví dụ:


-- Begin parse text: 001234A2
ValueError message: invalid literal for int() with base 10: '001234A2'
type(e): <class 'ValueError'>
-- End parse text: 001234A2
Value= 0

Đây là sơ luồng đi của chương trình. Khối finally luôn được thực thi.

Lệnh pass

Nếu bạn không muốn xử lý gì trong khối 'except' hoặc 'finally' bạn có thể sử dụng lệnh 'pass' (pass statement). Lệnh pass không làm bất cứ điều gì, nó giống như một lệnh null.

passStatementExample.py


print ("Three")
try :
    value = 10 / 0;
except Exception as e:
    pass

print ("Two")  
print ("One")
print ("Let's go")

Output:

5- Ném tiếp ngoại lệ

Trong khi xử lý ngoại lệ bạn có thể bắt ngoại lệ đó và xử lý hoặc có thể ném tiếp (rethrow) nó ra vòng ngoài.

reRaiseExceptionDemo1.py


def checkScore(score) :
    if score < 0 or score > 100:
        raise Exception("Invalid Score " + str(score) )

def checkPlayer(name, score):
    try :
        checkScore(score)
    except Exception as e :
        print ("Something invalid with player: ",name, ' >> ', str(e) )
        # re throw exception.
        raise   
# ------------------------------------------ 
checkPlayer("Tran", 101)          

Ví dụ, bắt ngoại lệ và ném tiếp (rethrow) bởi một ngoại lệ khác.

reRaiseExceptionDemo2.py


def checkScore(score) :  
    if score < 0 or score > 100:
        raise Exception("Invalid Score " + str(score) )

def checkPlayer(name, score):
    try :
        checkScore(score)
    except Exception as e :
        print ("Something invalid with player: ",name, ' >> ', str(e) )
        # throw new exception.
        raise Exception("Something invalid with player: "+ name + " >> "+ str(e)) 

# ------------------------------------------ 
checkPlayer("Tran", 101)          

6- Gói một Exception trong một Exception khác

Python cho phép bắt  ngoại lệ, và ném ra một ngoại lệ mới, ngoại lệ mới có thể lưu trữ thông tin của ngoại lệ ban đầu, mà bạn có thể truy cập thông qua thuộc tính __cause__.

Syntax


try : 
    # Làm gì đó tại đây...
except Exception as e : 
    raise OtherException("Message...") from e

Xem ví dụ đầy đủ:

wrapExceptionDemo.py


# Python 3.x:
# Ngoại lệ giới tính.
class GenderException(Exception): 
    def __init__(self, msg):
        super().__init__(msg)     

# Ngoại lệ ngôn ngữ.
class LanguageException(Exception): 
    def __init__(self, msg):
        super().__init__(msg)     


class PersonException(Exception): 
    def __init__(self, msg):
        super().__init__(msg)

# Hàm này có thể ném ra GenderException.
def checkGender(gender): 
    if gender != 'Female' :
        raise GenderException("Accept female only")

# Hàm này có thể ném ra LanguageException.
def checkLanguage(language):   
    if language != 'English' :
        raise LanguageException("Accept english language only") 

def checkPerson(name, gender, language): 
    try : 
        # Có thể ném ra GenderException.
        checkGender(gender)
        # Có thể ném ra LanguageException.
        checkLanguage(language)
    except Exception as e:
        # Bắt exception và ném ra ngoại lệ khác.
        # Ngoại lệ mới có thông tin __cause__ = e.
        raise PersonException(name + " does not pass") from e
    
# -------------------------------------------------------- 
try  : 
    checkPerson("Nguyen", "Female", "Vietnamese") 
except PersonException as e: 
    print ("Error message: ", str(e) )    
    # GenderException hoặc LanguageException
    cause = e.__cause__   
    print ('e.__cause__: ', repr(cause)) 
    print ("type(cause): " , type(cause) ) 
    print (" ------------------ ")
    
    if type(cause) is GenderException : 
        print ("Gender exception: ", cause) 
    elif type(cause) is LanguageException: 
        print ("Language exception: ", cause)

Output:


Error message: Nguyen does not pass
e.__cause__: LanguageException('Accept english language only',)
type(cause): <class '__main__.LanguageException'>
 ------------------
Language exception: Accept english language only