Exception (ngoại lệ) là các sự kiện bất thường xảy ra trong quá trình thực thi chương trình, gây ra sự gián đoạn và có thể dẫn đến việc chương trình bị dừng đột ngột. Xử lý exception là một phần quan trọng trong lập trình, giúp bạn kiểm soát và quản lý các lỗi một cách hiệu quả, đảm bảo chương trình hoạt động ổn định và đáng tin cậy.
Các Loại Exception trong Python
Python cung cấp nhiều loại exception tích hợp sẵn, bao gồm:
ZeroDivisionError
: Xảy ra khi chia một số cho 0.IndexError
: Xảy ra khi truy cập một chỉ số không hợp lệ trong danh sách.KeyError
: Xảy ra khi truy cập một key không tồn tại trong dictionary.ValueError
: Xảy ra khi một hàm nhận một đối số có giá trị không hợp lệ.TypeError
: Xảy ra khi một thao tác hoặc hàm được áp dụng cho một đối tượng có kiểu không hợp lệ.FileNotFoundError
: Xảy ra khi cố gắng mở một file không tồn tại.
Cú pháp của Xử lý Exception
Python sử dụng các khối try
, except
, else
, và finally
để xử lý exception.
Cú pháp cơ bản
python
try:
# Mã có thể gây ra exception
pass
except SomeException as e:
# Xử lý exception
pass
else:
# Mã thực thi nếu không có exception
pass
finally:
# Mã luôn được thực thi
pass
Ví dụ về Xử lý Exception
Ví dụ 1: Xử lý ZeroDivisionError
python
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"Error: {e}")
else:
print(f"Result: {result}")
finally:
print("This block is always executed.")
Kết quả:
Error: division by zero
This block is always executed.
Trong ví dụ trên, exception ZeroDivisionError
được bắt và xử lý trong khối except
. Khối finally
luôn được thực thi, bất kể có exception hay không.
Ví dụ 2: Xử lý Multiple Exceptions
python
try:
value = int("abc")
except ValueError as e:
print(f"ValueError: {e}")
except TypeError as e:
print(f"TypeError: {e}")
else:
print(f"Value: {value}")
finally:
print("This block is always executed.")
Kết quả:
ValueError: invalid literal for int() with base 10: 'abc'
This block is always executed.
Trong ví dụ trên, exception ValueError
được bắt và xử lý trong khối except
tương ứng.
Ví dụ 3: Xử lý Exception với else
python
try:
value = int("123")
except ValueError as e:
print(f"ValueError: {e}")
else:
print(f"Value: {value}")
finally:
print("This block is always executed.")
Kết quả:
Value: 123
This block is always executed.
Trong ví dụ trên, không có exception xảy ra, do đó khối else
được thực thi.
Tạo Exception Tùy Chỉnh
Bạn có thể tạo các exception tùy chỉnh bằng cách kế thừa từ lớp Exception
.
Ví dụ: Tạo Exception Tùy Chỉnh
python
class CustomError(Exception):
def __init__(self, message):
self.message = message
try:
raise CustomError("This is a custom error.")
except CustomError as e:
print(f"CustomError: {e.message}")
Kết quả:
CustomError: This is a custom error.
Trong ví dụ trên, exception tùy chỉnh CustomError
được tạo và ném ra bằng cách sử dụng từ khóa raise
.
Sử dụng raise
để Ném Exception
Bạn có thể sử dụng từ khóa raise
để ném một exception, cho phép bạn kiểm soát khi nào và tại sao một exception được ném ra.
Ví dụ: Sử dụng raise
python
def divide(a, b):
if b == 0:
raise ValueError("Cannot divide by zero.")
return a / b
try:
result = divide(10, 0)
except ValueError as e:
print(f"Error: {e}")
Kết quả:
Error: Cannot divide by zero.
Trong ví dụ trên, exception ValueError
được ném ra khi cố gắng chia cho 0.
Sử dụng finally
để Dọn Dẹp Tài Nguyên
Khối finally
luôn được thực thi, bất kể có exception hay không. Điều này rất hữu ích để dọn dẹp tài nguyên, chẳng hạn như đóng file hoặc kết nối mạng.
Ví dụ: Sử dụng finally
python
try:
file = open("example.txt", "r")
content = file.read()
except FileNotFoundError as e:
print(f"Error: {e}")
finally:
if 'file' in locals() and not file.closed:
file.close()
print("File closed.")
Kết quả:
Error: [Errno 2] No such file or directory: 'example.txt'
Trong ví dụ trên, khối finally
đảm bảo rằng file được đóng nếu nó đã được mở.
Xử lý Exception trong Các Tình Huống Thực Tế
Ví dụ: Xử lý Exception trong Đọc File
python
def read_file(file_path):
try:
with open(file_path, "r") as file:
return file.read()
except FileNotFoundError as e:
print(f"Error: {e}")
except IOError as e:
print(f"IOError: {e}")
content = read_file("example.txt")
if content:
print(content)
Kết quả:
Error: [Errno 2] No such file or directory: 'example.txt'
Trong ví dụ trên, các exception FileNotFoundError
và IOError
được bắt và xử lý khi đọc file.
Ví dụ: Xử lý Exception trong Kết Nối Mạng
python
import requests
def fetch_data(url):
try:
response = requests.get(url)
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
print(f"HTTPError: {e}")
except requests.exceptions.ConnectionError as e:
print(f"ConnectionError: {e}")
except requests.exceptions.Timeout as e:
print(f"Timeout: {e}")
except requests.exceptions.RequestException as e:
print(f"RequestException: {e}")
data = fetch_data("https://api.example.com/data")
if data:
print(data)
Kết quả:
HTTPError: 404 Client Error: Not Found for url: https://api.example.com/data
Trong ví dụ trên, các exception liên quan đến kết nối mạng được bắt và xử lý khi thực hiện yêu cầu HTTP.
Sử dụng assert
để Kiểm Tra Điều Kiện
Từ khóa assert
được sử dụng để kiểm tra các điều kiện và ném ra AssertionError
nếu điều kiện không đúng. Điều này rất hữu ích để kiểm tra các giả định trong mã nguồn.
Ví dụ: Sử dụng assert
python
def divide(a, b):
assert b != 0, "Cannot divide by zero."
return a / b
try:
result = divide(10, 0)
except AssertionError as e:
print(f"AssertionError: {e}")
Kết quả:
AssertionError: Cannot divide by zero.
Trong ví dụ trên, AssertionError
được ném ra khi cố gắng chia cho 0.
Kết Luận
Xử lý exception là một phần quan trọng trong lập trình, giúp bạn kiểm soát và quản lý các lỗi một cách hiệu quả, đảm bảo chương trình hoạt động ổn định và đáng tin cậy. Python cung cấp các công cụ mạnh mẽ để xử lý exception, bao gồm các khối try
, except
, else
, và finally
, cũng như khả năng tạo các exception tùy chỉnh và sử dụng từ khóa raise
để ném exception.
Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về cách xử lý exception trong Python và cách sử dụng các phương pháp khác nhau để đạt được mục tiêu của bạn.