سطح مقدماتی (Beginner Level)
در برنامهنویسی پایتون، خطاها به دو دسته کلی تقسیم میشوند: خطاهای نحوی (Syntax Errors) و استثناها (Exceptions). حتی اگر کد شما از نظر نوشتاری (نحوی) کاملاً درست باشد، ممکن است در زمان اجرا به دلیل ورودی نامناسب یا مشکلات منطقی، برنامه متوقف شود. در این بخش یاد میگیریم چگونه جلوی بسته شدن ناگهانی برنامه (Crash) را بگیریم.
۱. تفاوت Syntax Error و Exception
خطاهای نحوی زمانی رخ میدهند که مفسر پایتون کد را نمیفهمد (مثلاً فراموش کردن : ). اما استثناها زمانی رخ میدهند که کد اجرا میشود ولی به بنبست میخورد.
مثال اول: خطای نحوی (Syntax Error)
این کد اصلا اجرا نمیشود چون ساختار اشتباه است.
# Static: Interpreter stops immediately
if True
print("Missing colon")
مثال دوم: خطای زمان اجرا (Exception)
این کد ساختار درستی دارد، اما تقسیم عدد بر صفر غیرممکن است.
۲. بلوک try و except
برای مدیریت خطا، کدی که احتمال خطا دارد را در بلوک try و کدی که باید در صورت بروز خطا اجرا شود را در بلوک except مینویسیم.
مثال اول: مدیریت تقسیم بر صفر
به جای اینکه برنامه با رنگ قرمز خطا دهد، یک پیام مدیریت شده چاپ میکنیم.
مثال دوم: مدیریت نوع داده (TypeError)
اگر بخواهیم رشته را با عدد جمع کنیم، پایتون خطا میدهد.
مثال سوم: دریافت خطا به عنوان متغیر
گاهی میخواهیم متن اصلی خطای پایتون را هم ببینیم. از کلمه کلیدی as استفاده میکنیم.
۳. مدیریت چندین خطا (Multiple Exceptions)
یک بلوک try ممکن است دچار خطاهای مختلفی شود. ما میتوانیم برای هر کدام یک واکنش خاص داشته باشیم.
مثال اول: بلوکهای except جداگانه
در این روش دقیقاً مشخص میکنیم برای هر خطا چه اتفاقی بیفتد.
مثال دوم: دستهبندی خطاها
اگر بخواهیم برای چند نوع خطا یک واکنش یکسان نشان دهیم، آنها را داخل پرانتز (Tuple) میگذاریم.
سطح پیشرفته (Professional Level)
در سطح حرفهای، مدیریت خطا فقط جلوگیری از کرش نیست؛ بلکه بخشی از "کنترل جریان" (Control Flow) برنامه است. در اینجا با بلوکهای کامل try-except-else-finally، ساخت خطاهای سفارشی و سلسلهمراتب کلاسهای Exception آشنا میشویم.
۱. بلوکهای else و finally
- else: تنها زمانی اجرا میشود که هیچ خطایی در بلوک try رخ ندهد.
- finally: مهم نیست خطا رخ دهد یا نه، این بلوک همیشه اجرا میشود (معمولاً برای آزادسازی منابع مثل بستن فایل یا دیتابیس).
مثال اول: ساختار کامل
مثال دوم: کاربرد واقعی finally (شبهکد مدیریت منابع)
حتی اگر در حین کار با فایل خطا رخ دهد، فایل باید بسته شود.
# Static: File handling logic example
f = None
try:
f = open("data.txt", "r")
content = f.read()
except FileNotFoundError:
print("فایل پیدا نشد.")
finally:
if f:
f.close()
print("فایل بسته شد.")
۲. ایجاد خطا به صورت دستی (raise)
گاهی اوقات پایتون خطایی نمیگیرد، اما طبق منطق برنامه ما، شرایط غیرمجاز است. در این صورت با دستور raise یک خطا پرتاب میکنیم.
مثال اول: اعتبارسنجی ورودی
فرض کنید سن کاربر نباید منفی باشد.
مثال دوم: بازنویسی خطا (Re-raising)
گاهی خطا را میگیریم، لاگ میکنیم، اما میخواهیم برنامه در لایههای بالاتر هم متوجه خطا شود.
۳. ساخت خطاهای سفارشی (Custom Exceptions)
برای پروژههای بزرگ، استفاده از خطاهای پیشفرض پایتون (مثل ValueError) کافی نیست. بهتر است کلاس خطای خود را بسازید. این کلاس باید از Exception ارثبری کند.
مثال اول: تعریف یک خطای ساده
مثال دوم: خطای سفارشی با جزئیات بیشتر
میتوانیم در کلاس خطا، اطلاعات بیشتری ذخیره کنیم.
۴. نکات فنی و Best Practices
در سطح حرفهای باید مراقب باشید که چگونه از except استفاده میکنید.
- هرگز از
except:خالی استفاده نکنید: این کار تمام خطاها (حتی توقف برنامه با Ctrl+C) را میبلعد و دیباگ را غیرممکن میکند. - سلسله مراتب را بشناسید: کلاس
Exceptionپدر اکثر خطاهاست.
مثال: الگوی صحیح در مقابل غلط
# Static: Bad Practice
try:
# some code
pass
except: # WRONG: Catches everything including SystemExit
pass
# Static: Good Practice
try:
# some code
pass
except Exception as e: # RIGHT: Catches only code-related errors
print(e)