⚠️ مدیریت خطا (Error Handling) در پایتون
خطاها (Errors) یا استثناها (Exceptions) بخش جداییناپذیر برنامهنویسی هستند.
پایتون با استفاده از بلوکهای try، except، else و finally
به شما امکان میدهد خطاها را مدیریت کرده و از کرش کردن برنامه جلوگیری کنید.
🔹 انواع خطاهای رایج در پایتون
🔹 ساختار try/except
try:
# کدی که ممکن است خطا دهد
x = 10
y = 0
result = x / y
print(f"Result: {result}")
except ZeroDivisionError:
print("Error: Cannot divide by zero!")
except Exception as e:
print(f"An unexpected error occurred: {e}")
⏳ برای اجرا دکمه را بزنید...
🔹 try/except/else
بلوک else زمانی اجرا میشود که خطایی رخ ندهد.
try:
# کدی که ممکن است خطا دهد
num = int(input("Enter a number: "))
except ValueError:
print("Error: Invalid number!")
else:
# این بخش فقط در صورت عدم وجود خطا اجرا میشود
print(f"You entered: {num}")
print(f"Square: {num ** 2}")
🔹 try/except/finally
بلوک finally همیشه اجرا میشود، حتی اگر خطا رخ دهد.
try:
file = open("test.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("Error: File not found!")
finally:
print("This block always executes.")
🔹 ایجاد خطا با raise
با raise میتوانید بهصورت دستی خطا ایجاد کنید.
def validate_age(age):
if age < 0:
raise ValueError("Age cannot be negative!")
elif age > 150:
raise ValueError("Age cannot be more than 150!")
else:
return f"Valid age: {age}"
try:
print(validate_age(25)) # Valid
print(validate_age(-5)) # Error
except ValueError as e:
print(f"Error: {e}")
⏳ برای اجرا دکمه را بزنید...
🔹 ایجاد استثناهای سفارشی (Custom Exceptions)
# تعریف استثنای سفارشی
class InsufficientBalanceError(Exception):
"""Exception raised when account balance is insufficient."""
def __init__(self, balance, amount):
self.balance = balance
self.amount = amount
self.message = f"Cannot withdraw {amount}. Balance is {balance}."
super().__init__(self.message)
class BankAccount:
def __init__(self, balance):
self.balance = balance
def withdraw(self, amount):
if amount > self.balance:
raise InsufficientBalanceError(self.balance, amount)
self.balance -= amount
return f"Withdrew {amount}. New balance: {self.balance}"
# استفاده
account = BankAccount(100)
try:
print(account.withdraw(50)) # OK
print(account.withdraw(80)) # Error
except InsufficientBalanceError as e:
print(f"Error: {e}")
⏳ برای اجرا دکمه را بزنید...
🔹 assert (تأییدیه)
assert برای بررسی صحت یک شرط استفاده میشود و در صورت نادرست بودن، خطای AssertionError ایجاد میکند.
def divide(a, b):
assert b != 0, "Divisor cannot be zero!"
return a / b
try:
print(divide(10, 2)) # 5.0
print(divide(10, 0)) # AssertionError
except AssertionError as e:
print(f"Assertion Error: {e}")
⏳ برای اجرا دکمه را بزنید...
🔹 ثبت خطا با logging
با ماژول logging میتوانید خطاها را ثبت و مدیریت کنید.
import logging
# تنظیم logging
logging.basicConfig(
level=logging.ERROR,
format='%(asctime)s - %(levelname)s - %(message)s'
)
try:
result = 10 / 0
except ZeroDivisionError as e:
logging.error(f"Error occurred: {e}")
print("Error logged. Check the log for details.")
# همچنین میتوانید خطاهای سطح پایینتر را ثبت کنید
logging.warning("This is a warning message")
logging.info("This is an info message")
⏳ برای اجرا دکمه را بزنید...
🔹 مثال جامع: سیستم مدیریت کاربران
import logging
# تنظیم logging
logging.basicConfig(level=logging.ERROR)
class UserNotFoundError(Exception):
pass
class UserManager:
def __init__(self):
self.users = {}
def add_user(self, username, age):
if not username:
raise ValueError("Username cannot be empty!")
if age < 0:
raise ValueError("Age cannot be negative!")
if username in self.users:
raise KeyError(f"Username '{username}' already exists!")
self.users[username] = age
logging.info(f"User {username} added successfully.")
def get_user(self, username):
if username not in self.users:
raise UserNotFoundError(f"User '{username}' not found!")
return self.users[username]
def delete_user(self, username):
if username not in self.users:
raise UserNotFoundError(f"User '{username}' not found!")
age = self.users.pop(username)
logging.info(f"User {username} (age {age}) deleted.")
return age
# استفاده
manager = UserManager()
try:
manager.add_user("Saba", 25)
manager.add_user("Ali", 30)
manager.add_user("Saba", 28) # Duplicate username
except ValueError as e:
print(f"Error: {e}")
except KeyError as e:
print(f"Error: {e}")
# دریافت کاربر
try:
print(manager.get_user("Saba")) # 25
print(manager.get_user("Hossein")) # Not found
except UserNotFoundError as e:
print(f"Error: {e}")
# نمایش لیست کاربران
print("\nAll users:")
for username, age in manager.users.items():
print(f"{username}: {age} years old")
⏳ برای اجرا دکمه را بزنید...
📌 نکات کلیدی
- ✅ از
try/exceptبرای مدیریت خطاها استفاده کنید. - ✅
exceptمیتواند برای نوع خاصی از خطا باشد (مثلValueError). - ✅
elseدر صورت عدم وجود خطا اجرا میشود. - ✅
finallyهمیشه اجرا میشود (مناسب برای بستن منابع). - ✅ با
raiseمیتوانید خطا ایجاد کنید. - ✅ استثناهای سفارشی با ارثبری از
Exceptionایجاد میشوند. - ✅
assertبرای بررسی صحت شرط استفاده میشود. - ✅
loggingبرای ثبت خطاها در برنامههای حرفهای استفاده میشود. - ✅ مدیریت خطا باعث پایداری و قابلیت اطمینان برنامه میشود.