منظور از خطا موقعیتی هست که برنامه نمیتونه کد نوشته شده رو به درستی اجرا کنه. در چنین شرایطی پایتون اجرای برنامه رو متوقف میکنه و یک پیام خطا در پایتون نمایش میده تا مشخص کنه مشکل از کجا به وجود اومده.
در واقع زبان پایتون تلاش میکنه کد شما رو خط به خط بخونه و اجرا کنه. اگر در این مسیر به چیزی برسه که قابل فهم یا قابل اجرا نباشه، یک ارور پایتون ایجاد میشه. این ارور معمولا همراه با توضیح کوتاه و محل دقیق خطا نمایش داده میشه تا برنامهنویس بتونه مشکل رو پیدا کنه.
به عنوان مثال فرض کنین این کد رو اجرا کنیم:
python
1
print("Hello World"
در اینجا یک پرانتز بسته فراموش شده. وقتی برنامه اجرا بشه، پایتون متوجه میشه ساختار کد کامل نیست و اجرای برنامه متوقف میشه. نتیجه این میشه که یک پیام خطا نمایش داده میشه.
هدف این خطاهای پایتون در واقع کمک کردن به برنامهنویس هست. یعنی پایتون با نمایش خطا به ما میگه کجای برنامه درست نوشته نشده یا چه چیزی قابل اجرا نیست.
بررسی پیشنیازها در ویندوز
دلایل مختلفی وجود داره که باعث میشه ارور پایتون ظاهر بشه. بیشتر این خطاها به چند دسته کلی برمیگردن که در ادامه به طور کامل درباره انواع خطا در پایتون صحبت میکنیم، اما به طور کلی این خطاها معمولا به خاطر چند موضوع ساده ایجاد میشن.
یکی از رایجترین دلایل این هست که کد از نظر ساختار زبان درست نوشته نشده باشه. مثلا پرانتز جا افتاده باشه، نقل قول بسته نشده باشه یا یک علامت اشتباه استفاده شده باشه. در چنین حالتی معمولا خطای SyntaxError در پایتون دیده میشه.
گاهی هم مشکل از نام متغیرها یا توابع هست. مثلا متغیری استفاده میشه که هنوز تعریف نشده. در این حالت پایتون نمیتونه اون رو تشخیص بده و خطای NameError در پایتون نمایش داده میشه.
در بعضی مواقع هم برنامه از نظر منطقی مشکلی نداره اما نوع دادهها با هم سازگار نیستن. مثلا تلاش کنیم یک عدد و یک رشته رو با هم جمع کنیم. چنین شرایطی باعث ایجاد خطای TypeError در پایتون میشه.
یکی دیگر از موارد رایج مربوط به فاصلهگذاری کد هست. چون پایتون برای مشخص کردن ساختار برنامه از فاصله استفاده میکنه، اگر این فاصلهها درست نباشن خطای IndentationError در پایتون رخ میده.
گاهی هم برنامه تلاش میکنه یک کتابخانه یا ماژول رو import کنه اما اون ماژول در سیستم نصب نشده. در این حالت با خطای ModuleNotFoundError در پایتون روبهرو میشیم.
پیام خطا در پایتون چه کمکی به ما میکند؟
وقتی یک خطا در برنامه رخ میده، پایتون فقط نمیگه که برنامه مشکل داره. بلکه اطلاعاتی نمایش میده که کمک میکنه پیدا کردن خطا در کد پایتون راحتتر بشه.
این اطلاعات معمولا شامل موارد زیر هستن:
- نام فایل برنامه
- شماره خطی که خطا در آن رخ داده
- نوع خطا
- توضیح کوتاه درباره مشکل
به مجموعه این اطلاعات معمولا Traceback در پایتون گفته میشه. در واقع Traceback به ما نشون میده که برنامه در چه مسیری اجرا شده و در نهایت در کدام خط متوقف شده. به همین دلیل درک اون نقش مهمی در دیباگ کد پایتون داره.
در بخشهای بعدی به طور کامل درباره این موضوع صحبت میکنیم که چگونه پیام خطا در پایتون را بخوانیم و آموزش درک Traceback در پایتون و پیدا کردن محل خطا در کد چگونه انجام میشود.
چرا یاد گرفتن خطاهای پایتون برای برنامهنویس مهم است؟
تقریبا هیچ برنامهنویسی وجود نداره که هنگام برنامه نویسی پایتون با خطاهای پایتون مواجه نشه. حتی برنامهنویسهای حرفهای هم مرتب با ارورها روبهرو میشن. تفاوت اصلی این هست که اونا میدونن چطور خطا رو سریع تشخیص بدن و رفع کنن.
یاد گرفتن نحوه تشخیص خطا باعث میشه:
- سریعتر رفع خطا در پایتون انجام بشه
- زمان کمتری برای پیدا کردن مشکل صرف بشه
- مهارت دیباگ کد پایتون تقویت بشه
به همین دلیل در ادامه این بخشها به صورت مرحله به مرحله بررسی میکنیم که رایجترین خطاهای SyntaxError در پایتون و روش رفع آنها چیست، خطای NameError در پایتون چرا رخ میدهد و همینطور مشکلاتی مثل خطای IndentationError در پایتون و مشکل فاصله گذاری در کد یا خطای ModuleNotFoundError در پایتون و مشکل import ماژول چگونه به وجود میآیند.
همچنین یاد میگیریم روش پیدا کردن و رفع خطا در کدهای پایتون چیست، اشتباهات رایج مبتدیها که باعث ارور در پایتون میشه کدام هستند و در نهایت میبینیم چگونه خطاهای پایتون را در VS Code پیدا و رفع کنیم و آموزش بررسی خطاهای پایتون در ترمینال و محیط VS Code به چه شکل انجام میشه.
به این ترتیب وقتی در ادامه مطلب با خطاهای مختلف روبهرو میشیم، به راحتی میتونیم علت اونها رو تشخیص بدیم و برنامه رو اصلاح کنیم.
وقتی درباره خطا در پایتون صحبت میکنیم فقط یک نوع ارور مدنظر نیست، بلکه چند دسته مختلف از خطاهای پایتون وجود داره که هر کدوم در مرحله خاصی از اجرای برنامه اتفاق میفتن. آشنایی با انواع خطا در پایتون خیلی مهمه، چون تا وقتی ندونین با چه نوع خطایی طرف هستین، دیباگ کد پایتون سخت میشه.
به طور کلی خطاهای پایتون رو میتونیم به سه دسته اصلی تقسیم کنیم: خطاهای نحوی یا Syntax Error، خطاهای زمان اجرا یا Runtime Error، و خطاهای منطقی یا Logical Error. هر کدوم رفتار متفاوتی دارن و پیام خطا در پایتون هم بسته به نوع اون فرق میکنه.
اول از همه خطاهای نحوی رو داریم. خطای SyntaxError در پایتون زمانی رخ میده که ساختار کد با قواعد زبان هماهنگ نباشه. یعنی حتی قبل از اینکه برنامه اجرا بشه، مفسر پایتون متوجه میشه که کد از نظر نوشتاری مشکل داره. مثلا:
python
1
if x > 10
2
print("big")
اینجا دو نقطه بعد از شرط جا افتاده. در چنین حالتی برنامه اصلا اجرا نمیشه و بلافاصله یک ارور پایتون نمایش داده میشه. این نوع خطا جزو رایجترین خطاهای SyntaxError در پایتون هست و روش رفع اونها معمولا ساده هست، فقط باید سینتکس رو اصلاح کنیم.
نوع دوم، خطاهای زمان اجرا هستن. اینها زمانی رخ میدن که کد از نظر نوشتاری درست هست، اما هنگام اجرا به مشکل میخوره. مثلا:
python
1
print(10 / 0)
این کد از نظر نحوی درست هست، اما هنگام اجرا تقسیم بر صفر اتفاق میفته و برنامه متوقف میشه. اینجا پایتون یک پیام خطا همراه با Traceback نمایش میده تا نشون بده مشکل در کدوم خط رخ داده. علت نمایش Traceback در پایتون هنگام اجرای برنامه همین هست که مسیر رسیدن به خط خطا مشخص بشه.
در دسته خطاهای زمان اجرا، چند ارور معروف وجود داره که باید اونها رو بشناسیم. مثلا خطای NameError در پایتون زمانی رخ میده که از متغیری استفاده کنیم که تعریف نشده:
python
1
print(score)
اگر قبلش score تعریف نشده باشه، پایتون نمیدونه این نام به چه چیزی اشاره داره. اگر بخوایم بدونیم خطای NameError در پایتون چرا رخ میده و چگونه این خطا را حل کنیم، پاسخ ساده هست: باید قبل از استفاده، متغیر رو تعریف کنیم.
خطای TypeError در پایتون و استفاده اشتباه از نوع دادهها هم خیلی رایج هست. مثلا:
python
1
print("10" + 5)
اینجا یک رشته رو با یک عدد جمع کردیم. از نظر منطقی شاید قصد تبدیل داشته باشیم، اما پایتون اجازه این کار رو بدون تبدیل صریح نمیده. این نوع خطا به ما یادآوری میکنه که نوع دادهها اهمیت داره.
خطای IndentationError در پایتون و مشکل فاصله گذاری در کد هم جزو موارد خاص این زبان هست. چون پایتون برای مشخص کردن بلوکها از تورفتگی استفاده میکنه، کوچکترین ناهماهنگی در فاصلهها میتونه باعث خطا بشه:
python
1
if True:
2
print("Hello")
اینجا چون تورفتگی رعایت نشده، برنامه اجرا نمیشه. این مورد از خطاها برای مبتدیان در پایتون خیلی زیاد دیده میشه.
خطای ModuleNotFoundError در پایتون و مشکل import ماژول هم زمانی رخ میده که برنامه سعی میکنه کتابخانهای رو ایمپورت کنه که نصب نشده یا نام اون اشتباه نوشته شده:
python
1
import numppy
اگر نام درست numpy باشه ولی اشتباه تایپ بشه، پایتون نمیتونه اون رو پیدا کنه و ارور میده.
دسته سوم خطاها، خطاهای منطقی هستن. اینها خطرناکترن چون پیام خطا در پایتون نمایش داده نمیشه. برنامه اجرا میشه اما خروجی اشتباه تولید میکنه. مثلا فرمول رو اشتباه پیادهسازی کرده باشیم. در این حالت نه SyntaxError داریم و نه Traceback ، اما نتیجه نهایی غلط هست. اینجاست که مهارت دیباگ کد پایتون اهمیت پیدا میکنه.
تفاوت اصلی بین این انواع خطا در پایتون در این هست که بعضی قبل از اجرا متوقف میکنن، بعضی هنگام اجرا باعث توقف میشن و بعضی اصلا برنامه رو متوقف نمیکنن ولی نتیجه اشتباه میدن. وقتی این تفاوت رو بفهمیم، پیدا کردن خطا در کد پایتون سریعتر انجام میشه.
در ادامه مباحث به صورت جداگانه بررسی میکنیم که چگونه پیام خطا در پایتون را بخوانیم، آموزش درک Traceback در پایتون و پیدا کردن محل خطا در کد چگونه انجام میشود، و همینطور روش پیدا کردن و رفع خطا در کدهای پایتون چگونه است. بعدا هم میبینیم بررسی خطاهای پایتون در ترمینال و محیط VS Code چگونه انجام میشود و ارور پایتون در VS Code چگونه نمایش داده میشود.
اگر از همین ابتدا بدونیم با چه نوع خطایی روبهرو هستیم، نصف مسیر رفع خطا در پایتون رو رفتیم. چون هر نوع ارور منطق خاص خودش رو داره و روش برخورد با اون هم متفاوت هست.
وقتی برنامه اجرا میشه و مشکلی در کد وجود داشته باشه، پایتون یک پیام خطا در پایتون نمایش میده. این پیام معمولا داخل ترمینال یا محیط توسعه مثل VS Code نمایش داده میشه و شامل اطلاعاتی هست که کمک میکنه محل و نوع مشکل رو تشخیص بدیم.
خیلی از افرادی که تازه برنامهنویسی رو شروع میکنن، وقتی با یک ارور پایتون مواجه میشن فکر میکنن پیام خطا پیچیده یا غیرقابل فهم هست. اما در واقع اگر بدونیم هر بخش از این پیام چه چیزی رو نشون میده، پیدا کردن خطا در کد پایتون خیلی سادهتر میشه.
تقریبا تمام خطاهای پایتون یک ساختار مشخص دارن. این ساختار معمولا شامل سه بخش اصلی هست: مسیر اجرای برنامه، شماره خطی که خطا در اون رخ داده و نوع خطا.
برای مثال این کد رو در نظر بگیرین:
test.py
1
name = "Ali"
2
print(age)
اگر این برنامه اجرا بشه، پایتون چنین پیامی نمایش میده:
Bash
1
Traceback (most recent call last):
2
File "test.py", line 2, in <module>
3
print(age)
4
NameError: name 'age' is not defined
اگر بخوایم خواندن پیام خطا در پایتون رو درست یاد بگیریم، باید این بخشها رو جداگانه بررسی کنیم.
اولین بخش معمولا با عبارت Traceback میشه. این قسمت مسیر اجرای برنامه رو نشون میده و میگه برنامه تا قبل از رخ دادن خطا چه مراحلی رو طی کرده. علت نمایش Traceback در پایتون هنگام اجرای برنامه همین هست که مشخص بشه برنامه دقیقا در چه مسیری اجرا شده و در کجا متوقف شده.
در خط بعدی معمولا نام فایل و شماره خط نوشته میشه. مثلا:
Bash
1
File "test.py", line 2
این بخش خیلی مهمه چون مستقیم به ما میگه مشکل در کدوم خط رخ داده. اگر برنامه بزرگ باشه، همین اطلاعات کمک زیادی به دیباگ کد پایتون میکنه.
در آخرین خط هم نوع خطا و توضیح کوتاه اون نمایش داده میشه. در مثال بالا نوشته شده:
Bash
1
NameError: name 'age' is not defined
این یعنی خطای NameError در پایتون رخ داده و دلیل اون این هست که متغیر age تعریف نشده. اگر بخوایم بدونیم خطای NameError در پایتون چرا رخ میده و چگونه مشکل رو حل کنیم، کافیه متغیر رو قبل از استفاده تعریف کنیم.
ارتباط نوع پیام خطا با انواع خطا در پایتون
در بخش قبل درباره انواع خطا در پایتون صحبت کردیم. نکته مهم این هست که نوع خطا معمولا در آخر پیام خطا نوشته میشه. بنابراین فقط با نگاه کردن به این قسمت میتونیم بفهمیم با چه مشکلی روبهرو هستیم.
مثلا اگر پیام خطا با SyntaxError تموم بشه، یعنی ساختار کد مشکل داره. این مورد از خطاهای رایج پایتون هست و معمولا به خاطر جا افتادن پرانتز، کوتیشن یا علامتهای نگارشی رخ میده. در ادامه جداگانه درباره رایجترین خطاهای SyntaxError در پایتون و روش رفع آنها صحبت میکنیم.
گاهی هم پیام خطا مربوط به خطای TypeError در پایتون و استفاده اشتباه از نوع دادهها هست. مثلا:
python
1
age = 20
2
print("Age: " + age)
در اینجا پایتون نمیتونه یک رشته و عدد رو مستقیما با هم جمع کنه و TypeError ایجاد میشه.
در بعضی مواقع هم ممکن هست با خطای ModuleNotFoundError در پایتون و مشکل import ماژول مواجه بشیم. این اتفاق معمولا زمانی رخ میده که برنامه تلاش میکنه یک کتابخانه رو import کنه اما اون ماژول در سیستم نصب نشده یا نام اون اشتباه نوشته شده.
همچنین اگر فاصلهگذاری کد درست نباشه، پایتون خطای IndentationError رو نمایش میده. این مورد از خطاها برای مبتدیان در پایتون خیلی رایج هست، چون پایتون نسبت به تورفتگی کد بسیار حساس هست.
پیام خطا پایتون رو کجا میبینیم؟
بسته به اینکه برنامه رو کجا اجرا کنیم، پیام خطا در پایتون ممکن هست در جاهای مختلفی نمایش داده بشه. اگر برنامه رو از طریق خط فرمان اجرا کنیم، ارورها مستقیما در ترمینال ظاهر میشن. به همین دلیل یکی از مهارتهای مهم برای برنامهنویسها بررسی خطا در ترمینال پایتون هست.
در محیطهای توسعه مثل VS Code هم ارورها در بخش ترمینال یا پنل خطا نمایش داده میشن. حتی در بسیاری از موارد این محیطها قبل از اجرای برنامه هم مشکلات احتمالی رو نشون میدن. به همین دلیل یاد گرفتن اینکه چگونه خطاهای پایتون را در VS Code پیدا و رفع کنیم میتونه روند برنامهنویسی رو سریعتر کنه.
اگر یک برنامهنویس بتونه پیام خطا رو درست بخونه، بخش بزرگی از مسیر روش پیدا کردن و رفع خطا در کدهای پایتون طی شده. چون اکثرا ارور پایتون دقیقا در همون پیام خطا توضیح داده میشن و فقط لازم هست بدونیم هر قسمت از اون چه معنی داره. در بخش بعدی دقیقتر به آموزش درک Traceback در پایتون و پیدا کردن محل خطا در کد میپردازیم تا بتونیم سریعتر مشکل برنامه رو تشخیص بدیم.
وقتی برنامه اجرا میشه و یکی از خطاهای پایتون رخ میده، معمولا اولین چیزی که در ترمینال میبینیم بخشی به نام Traceback هست. این قسمت در واقع گزارشی از مسیر اجرای برنامه هست که نشون میده برنامه از چه بخشهایی عبور کرده و در نهایت در کدوم خط متوقف شده.
به زبان ساده، Traceback مثل یک نقشه مسیر هست. وقتی یک ارور پایتون رخ میده، این نقشه کمک میکنه بفهمیم برنامه از کجا شروع شده، از چه توابعی عبور کرده و در کدوم نقطه به مشکل خورده.
به همین دلیل یکی از مهمترین مهارتها برای برنامهنویسها این هست که بدونن چگونه پیام خطا در پایتون را بخونن و مخصوصا بخش Traceback رو درست تحلیل کنن. در بسیاری از مواقع، فقط با نگاه کردن به همین بخش میشه پیدا کردن خطا در کد پایتون رو خیلی سریع انجام داد.
علت نمایش Traceback در پایتون هنگام اجرای برنامه همین موضوع هست؛ پایتون میخواد مسیر دقیق رسیدن به خط خطا رو نشون بده تا دیباگ کد پایتون سادهتر بشه.
ساختار Traceback در پایتون چگونه است؟
وقتی یک خطا رخ میده، پیام خطا معمولا ساختاری شبیه این داره:
Bash
1
Traceback (most recent call last):
2
File "app.py", line 4, in
3
print(age)
4
NameError: name 'age' is not defined
اولین خط یعنی:
Bash
1
Traceback (most recent call last):
این خط میگه پایتون در حال نمایش مسیر اجرای برنامه هست و آخرین جایی که اجرا شده در پایین لیست قرار داره.
در خط بعدی نام فایل و شماره خط نوشته میشه:
Bash
1
File "app.py", line 4, in
این قسمت بسیار مهم هست، چون مستقیم به ما میگه مشکل در کدوم خط از برنامه رخ داده. در فرآیند رفع خطا در پایتون معمولا اولین کاری که انجام میدیم همین هست که به همون خط مراجعه کنیم.
خط بعدی هم کدی رو نشون میده که باعث ایجاد خطا شده:
Bash
1
print(age)
در نهایت آخرین خط نوع خطا رو مشخص میکنه:
Bash
1
NameError: name 'age' is not defined
اینجا مشخص میشه که خطای NameError در پایتون رخ داده. اگر بخوایم بررسی کنیم خطای NameError در پایتون چرا رخ میده، پاسخ این هست که متغیر age قبل از استفاده تعریف نشده.
چگونه با استفاده از Traceback خطا را پیدا کنیم؟
وقتی یک Traceback نمایش داده میشه، بهترین روش این هست که از پایین به بالا اون رو بررسی کنیم. چون آخرین خط معمولا نوع خطا رو مشخص میکنه و خطوط بالاتر مسیر رسیدن به اون رو نشون میدن.
فرض کنین این کد رو داشته باشیم:
python
1
def calculate():
2
result = 10 + "5"
3
return result
4
5
calculate()
اگر این برنامه اجرا بشه، این پیام خطا در پایتون نمایش داده میشه:
Bash
1
Traceback (most recent call last):
2
File "app.py", line 5, in
3
calculate()
4
File "app.py", line 2, in calculate
5
result = 10 + "5"
6
TypeError: unsupported operand type(s)
در اینجا Traceback نشان میده که برنامه ابتدا در خط 5 تابع رو اجرا کرده و سپس داخل تابع در خط 2 به مشکل خورده. در نهایت نوع خطا مشخص میکنه که خطای TypeError در پایتون و استفاده اشتباه از نوع دادهها رخ داده.
این اطلاعات کمک میکنه خیلی سریع بفهمیم مشکل از جمع کردن یک عدد با رشته بوده.
نقش Traceback در دیباگ کد پایتون
در عمل، بیشتر فرآیند دیباگ کد پایتون از همین تحلیل Traceback شروع میشه. وقتی یک ارور رخ میده، اولین قدم اینه که ببینیم:
- خطا در کدوم فایل رخ داده
- شماره خط چنده
- نوع خطا چیه
با همین اطلاعات میشه بخش بزرگی از خطاهای رایج پایتون رو شناسایی کرد. مثلا اگر در انتهای پیام خطا عبارت SyntaxError نوشته شده باشه، مشکل از ساختار کد هست. اگر NameError باشه یعنی نام متغیر یا تابع شناخته نشده. اگر IndentationError باشه به معنی مشکل در فاصله گذاری کد هست.
Traceback را کجا میبینیم؟
بسته به اینکه برنامه رو کجا اجرا کنیم، Traceback در جاهای مختلفی نمایش داده میشه. اگر برنامه رو از طریق خط فرمان اجرا کنیم، این پیام در همونجا دیده میشه و به همین دلیل بررسی خطا در ترمینال پایتون یکی از مهارتهای پایه برای برنامهنویسها هست.
در محیطهای توسعه مثل VS Code هم Traceback در ترمینال داخلی نمایش داده میشه. علاوه بر اون، این محیطها معمولا خطی که خطا در اون رخ داده رو هم مشخص میکنن. به همین دلیل خیلی از برنامهنویسها ترجیح میدن ارور پایتون در VS Code رو همونجا بررسی کنن.
در بخشهای بعدی بیشتر درباره خطاهای پایتون در ترمینال و محیط VS Code صحبت میکنیم و میبینیم چگونه خطاهای پایتون را در VS Code پیدا و رفع کنیم.
در مجموع اگر بخوایم روش پیدا کردن و رفع خطا در کدهای ساده پایتون رو یاد بگیریم، فهمیدن Traceback یکی از مهمترین مهارتها هست. چون تقریبا تمام انواع خطا در پایتون هنگام اجرا همراه با Traceback نمایش داده میشن و همین اطلاعات میتونه مسیر پیدا کردن مشکل در برنامه رو خیلی کوتاهتر کنه.
در میان انواع خطا در پایتون، یکی از اولین مواردی که تقریبا همه برنامهنویسها باهاش مواجه میشن خطای SyntaxError در پایتون هست. این خطا زمانی رخ میده که ساختار نوشتن کد با قوانین نحوی زبان پایتون مطابقت نداشته باشه.
پایتون قبل از اینکه برنامه رو اجرا کنه، ابتدا کد رو از نظر ساختار بررسی میکنه. اگر در این مرحله مشکلی وجود داشته باشه، برنامه اصلا اجرا نمیشه و یک پیام خطا در پایتون نمایش داده میشه. به همین دلیل SyntaxError جزو خطاهایی هست که قبل از اجرای واقعی برنامه شناسایی میشه.
نکته مهم این هست که در بیشتر موارد، پیدا کردن خطا در کد پایتون وقتی از نوع SyntaxError باشه نسبتا ساده هست. چون پایتون معمولا همون خطی که مشکل داره رو در پیام خطا مشخص میکنه.
برای مثال کد زیر رو در نظر بگیرین:
python
1
if x > 10
2
print("Number is greater than 10")
اگر این کد اجرا بشه، این ارور پایتون نمایش داده میشه:
Bash
1
SyntaxError: expected ':'
در اینجا مشکل این هست که در انتهای دستور if دو نقطه نوشته نشده. وقتی این علامت اضافه بشه، مشکل برطرف میشه.
python
1
if x > 10:
2
print("Number is greater than 10")
این نوع اشتباه یکی از خطاهای رایج پایتون محسوب میشه و مخصوصا در میان افراد مبتدی بسیار دیده میشه.
فراموش کردن بستن پرانتز یا کوتیشن
یکی دیگر از رایجترین خطاهای SyntaxError در پایتون مربوط به بسته نشدن پرانتزها یا کوتیشنها هست. چون پایتون باید بدونه دقیقا رشته یا عبارت از کجا شروع و در کجا تموم میشه.
برای مثال:
python
1
message = "Hello world
2
print(message)
در اینجا رشته با کوتیشن شروع شده اما بسته نشده. وقتی برنامه اجرا بشه، یک پیام خطا در پایتون نمایش داده میشه که معمولا چیزی شبیه این هست:
Bash
1
SyntaxError: unterminated string literal
برای رفع خطا در پایتون در این حالت فقط کافیه رشته رو به درستی ببندیم.
python
1
message = "Hello world"
2
print(message)
استفاده اشتباه از عملگرها
گاهی SyntaxError به خاطر استفاده اشتباه از عملگرها رخ میده. مثلا استفاده از عملگر انتساب به جای عملگر مقایسه در یک شرط.
python
1
if x = 5:
2
print("x is 5")
در اینجا پایتون نمیتونه این ساختار رو تفسیر کنه و یک خطای SyntaxError نمایش میده. دلیل آن این هست که در شرطها باید از عملگر مقایسه استفاده بشه.
نسخه درست کد به این شکل هست:
python
1
if x == 5:
2
print("x is 5")
در فرآیند دیباگ کد پایتون معمولا چنین خطاهایی خیلی سریع قابل تشخیص هستن، چون محل خطا در پیام نمایش داده میشه.
نامگذاری نامعتبر برای متغیرها
گاهی هم SyntaxError به خاطر استفاده از کاراکترهای نامعتبر در نام متغیرها رخ میده. قوانین نامگذاری در پایتون ساده هست؛ نام متغیر باید با حرف یا آندرلاین شروع بشه و فقط شامل حروف، اعداد و آندرلاین باشه.
مثلا این کد مشکل داره:
python
1
user-name = "Ali"
پایتون در اینجا علامت - رو به عنوان عملگر ریاضی در نظر میگیره و در نتیجه ساختار کد نامعتبر میشه.
نسخه درست:
python
1
user_name = "Ali"
ارتباط SyntaxError با Traceback و پیام خطا
وقتی خطای SyntaxError در پایتون رخ میده، معمولا Traceback در پایتون خیلی کوتاهتر از خطاهای دیگه هست. دلیلش این هست که برنامه هنوز وارد مرحله اجرای واقعی نشده هست.
در بیشتر مواقع پیام خطا فقط نام فایل و شماره خط رو نشان میده. به همین دلیل اگر بدونیم چگونه پیام خطا در پایتون را بخوانیم، تشخیص این نوع خطا بسیار سریع میشه.
در محیطهای توسعه مثل VS Code حتی قبل از اجرای برنامه هم این خطاها مشخص میشن. معمولا خطی که مشکل داره با رنگ قرمز یا علامت هشدار مشخص میشه و همین موضوع باعث میشه ارور پایتون در VS Code خیلی سریع قابل تشخیص باشه.
جمعبندی
در میان خطاهای پایتون، SyntaxError یکی از سادهترین اما در عین حال رایجترین مشکلاتی هست که هنگام نوشتن کد دیده میشه. این خطا معمولا به دلیل اشتباهات کوچک در ساختار کد رخ میده؛ مثل فراموش کردن دو نقطه، بسته نشدن پرانتز یا استفاده اشتباه از عملگرها.
خبر خوب این هست که این نوع خطاها معمولا خیلی سریع قابل تشخیص هستن، چون پایتون در همون پیام خطا در پایتون خط مشکلدار رو مشخص میکنه. به همین دلیل یاد گرفتن تشخیص این موارد بخش مهمی از روش پیدا کردن و رفع خطا در کدهای ساده پایتون محسوب میشه.
در ادامه به یکی دیگر از خطاهای مهم میرسیم و بررسی میکنیم خطای NameError در پایتون چرا رخ میده و چگونه این خطا را حل کنیم تا دید کاملتری نسبت به انواع خطا در پایتون پیدا کنین.
در میان انواع خطا در پایتون، یکی از خطاهایی که خیلی زود با آن مواجه میشیم خطای NameError در پایتون هست. این خطا زمانی رخ میده که برنامه سعی میکنه از یک نام استفاده کنه که برای مفسر پایتون شناخته شده نیست.
به زبان ساده، وقتی پایتون در حال اجرای کد هست و به یک متغیر، تابع یا شیء برخورد میکنه که قبلا تعریف نشده یا در محدوده قابل دسترسی قرار نداره، یک پیام خطا در پایتون از نوع NameError نمایش داده میشه.
برخلاف خطای SyntaxError در پایتون که قبل از اجرای برنامه تشخیص داده میشه، NameError در زمان اجرای برنامه اتفاق میفته. به همین دلیل در چنین شرایطی معمولا یک Traceback در پایتون هم نمایش داده میشه تا مشخص کنه برنامه در چه مسیری اجرا شده و دقیقا در کدام خط به مشکل خورده.
در فرآیند دیباگ کد پایتون توجه به همین Traceback کمک میکنه خیلی سریع محل مشکل مشخص بشه.
استفاده از متغیر قبل از تعریف
رایجترین دلیل رخ دادن خطای NameError در پایتون این هست که متغیری قبل از تعریف شدن استفاده بشه. این مورد جزو خطاهای رایج پایتون مخصوصا برای کسانی هست که تازه برنامهنویسی رو شروع کردن.
مثلا این کد رو در نظر بگیرین:
python
1
print(score)
2
score = 100
وقتی این برنامه اجرا بشه، پایتون هنوز متغیر score رو نمیشناسه. در نتیجه چنین ارور پایتون نمایش داده میشه:
Bash
1
NameError: name 'score' is not defined
برای رفع خطا در پایتون در این حالت فقط کافی هست ترتیب تعریف متغیر رو اصلاح کنیم.
python
1
score = 100
2
print(score)
در چنین مواردی اگر بدونیم چگونه پیام خطا در پایتون را بخوانیم، خیلی سریع متوجه میشیم مشکل دقیقا مربوط به کدام نام هست.
اشتباه تایپی در نام متغیر یا تابع
یکی دیگر از دلایل بسیار رایج خطای NameError در پایتون اشتباه تایپی در نام متغیر یا تابع هست. پایتون نسبت به بزرگی و کوچکی حروف حساس هست و کوچکترین تفاوت در نام باعث میشه آن رو به عنوان یک نام جدید در نظر بگیرد.
برای مثال:
python
1
user_name = "Sara"
2
print(username)
در اینجا متغیر با نام user_name تعریف شده اما هنگام استفاده username نوشته شده. همین تفاوت کوچک باعث میشه پایتون اون نام رو پیدا نکنه و NameError رخ بده.
مشکل در محدوده دسترسی متغیرها (Scope)
گاهی هم خطای NameError در پایتون به خاطر محدوده دسترسی متغیرها رخ میده. متغیرهایی که داخل یک تابع تعریف میشن معمولا فقط داخل همون تابع قابل استفاده هستن.
مثلا:
python
1
def show_number():
2
number = 10
3
print(number)
4
5
show_number()
6
print(number)
در این مثال متغیر number فقط داخل تابع تعریف شده. وقتی برنامه در خط آخر سعی میکنه اون رو چاپ کنه، پایتون اون رو پیدا نمیکنه و خطای NameError رخ میده.
در چنین شرایطی Traceback کمک میکنه بفهمیم مشکل دقیقا در کدام خط رخ داده و همین موضوع بخش مهمی از درک خطای Traceback در پایتون محسوب میشه.
فراموش کردن import ماژول یا نام مورد نظر
یکی دیگر از دلایل ایجاد خطای NameError در پایتون مربوط به استفاده از توابع یا کلاسهایی هست که از یک ماژول خارجی میان اما به درستی import نشدن.
مثلا:
python
1
print(datetime.now())
اگر ماژول datetime رو import نکرده باشیم، پایتون چنین پیامی نمایش میده:
Bash
1
NameError: name 'datetime' is not defined
در این حالت باید ماژول رو وارد برنامه کنیم:
python
1
import datetime
2
3
print(datetime.datetime.now())
البته اگر ماژول اصلا در سیستم وجود نداشته باشه، معمولا با خطای ModuleNotFoundError در پایتون و مشکل import ماژول مواجه میشیم که در بخش بعدی به صورت جدا بررسی میشه.
نقش NameError در فرآیند دیباگ کد
در عمل، خطای NameError در پایتون یکی از خطاهایی هست که معمولا سریع قابل تشخیص هست. چون در انتهای پیام خطا در پایتون نام دقیقی که شناخته نشده نمایش داده میشه.
وقتی این خطا در بررسی خطا در ترمینال پایتون یا در محیطهایی مثل VS Code دیده میشه، بهترین کار این هست که به نام متغیر یا تابع نگاه کنیم، بررسی کنیم آیا قبل از استفاده تعریف شده یا نه و مطمئن بشیم املای آن در همه جا یکسان هست.
در محیطهای توسعه مثل VS Code هم معمولا این نوع مشکلات خیلی سریع قابل تشخیص هستن و همین باعث میشه ارور پایتون در VS Code راحتتر مدیریت بشه.
جمعبندی
خطای NameError در پایتون زمانی رخ میده که برنامه به نامی برخورد کنه که برای آن تعریف نشده یا در محدوده قابل دسترسی قرار نداره. این مشکل معمولا به دلیل استفاده از متغیر قبل از تعریف، اشتباه تایپی در نامها، یا فراموش کردن import یک ماژول ایجاد میشه.
در مقایسه با برخی خطاهای پایتون دیگر مثل خطای TypeError در پایتون و استفاده اشتباه از نوع دادهها یا خطای IndentationError در پایتون و مشکل فاصله گذاری در کد، NameError بیشتر به مدیریت نامها در برنامه مربوط میشه.
شناخت این خطا و یاد گرفتن تشخیص سریع آن بخش مهمی از روش پیدا کردن و رفع خطا در کدهای ساده پایتون هست و کمک میکنه هنگام توسعه برنامهها سریعتر بتونیم مشکلات کد رو شناسایی و اصلاح کنیم.
در ادامه بحثهای مربوط به انواع خطا در پایتون، حالا به یکی از خطاهایی میرسیم که خیلی مستقیم به ساختار ظاهری کد مربوط هست، یعنی خطای IndentationError در پایتون. اگر قبلا گفتیم خطا در پایتون چیست و چرا هنگام اجرای کد رخ میده، اینجا با موردی روبهرو هستیم که دلیلش نه منطق اشتباه هست و نه نوع داده ناسازگار، بلکه فقط فاصله گذاری نادرست هست.
برخلاف بسیاری از زبانهای برنامهنویسی که از آکولاد {} برای مشخص کردن بلوک کد استفاده میکنند، پایتون از تورفتگی یا همون indentation استفاده میکنه. یعنی فاصله ابتدای خط مشخص میکنه که یک دستور داخل یک بلوک قرار داره یا نه. به همین دلیل اگر این فاصله گذاری درست نباشه، یکی از خطاهای پایتون از نوع IndentationError رخ میده.
این خطا معمولا جزو خطاهای نحوی محسوب میشه و از نظر ماهیت به خطای SyntaxError در پایتون نزدیک هست، اما چون به صورت خاص به تورفتگی مربوط میشه، پیام جداگانهای داره.
یک مثال ساده از IndentationError
کد زیر رو در نظر بگیرین:
python
1
if True:
2
print("Hello")
در اینجا بعد از شرط if پایتون انتظار داره دستور بعدی با یک تورفتگی مشخص نوشته بشه. اما چون فاصله ابتدای خط رعایت نشده، هنگام اجرا چنین پیام خطا در پایتون نمایش داده میشه:
Bash
1
IndentationError: expected an indented block
برای رفع خطا در پایتون در این حالت فقط کافی هست تورفتگی رو اصلاح کنیم:
python
1
if True:
2
print("Hello")
همین تغییر ساده باعث میشه برنامه بدون مشکل اجرا بشه.
ترکیب فاصله و تب؛ یک مشکل رایج
یکی از خطاهای رایج پایتون مخصوصا در میان مبتدیان این هست که بعضی خطوط با Tab و بعضی دیگر با Space نوشته میشن. در ظاهر ممکن هست فاصلهها یکسان به نظر برسن، اما پایتون آنها رو متفاوت در نظر میگیره.
مثلا:
python
1
if True:
2
print("Hello")
3
print("Hello")
در این حالت ممکن هست با پیامی مثل این روبهرو بشیم:
Bash
1
IndentationError: unindent does not match any outer indentation level
در فرآیند دیباگ کد پایتون در چنین شرایطی باید بررسی کنیم که همه تورفتگیها با یک روش ثابت انجام شده باشن. در VS Code میتوان تنظیم کرد که همیشه از Space استفاده بشه تا این مشکل کمتر رخ بده.
نقش Traceback در تشخیص خطای IndentationError
در بیشتر موارد، وقتی خطای IndentationError رخ میده، خطای Traceback در پایتون خیلی طولانی نیست، چون برنامه هنوز وارد اجرای عمیق توابع نشده هست. اما همون خطی که مشکل داره در پیام مشخص میشه.
قبلا درباره درک Traceback در پایتون و پیدا کردن محل خطا در کد صحبت کردیم، اینجا هم همون اصل برقرار هست؛ باید از پایینترین بخش پیام شروع کنیم و ببینیم دقیقا کدوم خط به عنوان محل خطا معرفی شده.
علت نمایش Traceback در پایتون هنگام اجرای برنامه این هست که مفسر میخواد مسیر رسیدن به خطا رو نشان بده. در خطای IndentationError معمولا همون خطی که فاصله گذاری اشتباه داره به صورت مستقیم مشخص میشه، بنابراین پیدا کردن خطا در کد پایتون سادهتر هست.
تفاوت خطای IndentationError با NameError و TypeError
در خطای NameError در پایتون مشکل مربوط به تعریف نبودن یک نام هست. در خطای TypeError در پایتون و استفاده اشتباه از نوع دادهها مشکل از ناسازگاری نوع دادههاست. اما در خطای IndentationError در پایتون و مشکل فاصله گذاری در کد فقط ساختار بلوکها اشتباه نوشته شده.
در نتیجه اگر برنامه حتی قبل از اجرای واقعی منطق کد متوقف بشه و پیام مربوط به indentation نمایش داده بشه، باید تمرکز رو روی ساختار ظاهری کد بزاریم، نه متغیرها یا نوع دادهها.
بررسی این خطا در ترمینال و VS Code
در بررسی خطا در ترمینال پایتون، معمولا پیام خطا به همراه شماره خط نمایش داده میشه. کافی هست به همون خط بریم و تورفتگی رو بررسی کنیم. در محیطهایی مثل VS Code هم معمولا خط مشکلدار با رنگ قرمز مشخص میشه و حتی گاهی پیشنهاد اصلاح میده. به همین دلیل مدیریت ارور پایتون در VS Code معمولا سادهتر از کار در ترمینال خام هست.
اگر بخوایم بدونیم چگونه خطاهای پایتون را در VS Code پیدا و رفع کنیم، یکی از اولین قدمها فعال بودن نمایش whitespace و تنظیم استفاده از Space به جای Tab هست.
جمعبندی
خطای IndentationError در پایتون یکی از خطاهای ساختاری هست که به دلیل رعایت نکردن تورفتگی صحیح در بلوکهای کد رخ میده. چون پایتون برای مشخص کردن ساختار از فاصله استفاده میکنه، کوچکترین بینظمی در این بخش میتونه باعث توقف برنامه بشه.
در مقایسه با سایر مواردی که در آشنایی با انواع خطا در پایتون برای مبتدیها بررسی کردیم، این خطا بیشتر به نظم نوشتاری کد مربوط میشه تا منطق یا داده. خوشبختانه چون پیام خطا در پایتون معمولا دقیق هست و شماره خط رو مشخص میکنه، رفع آن نسبتا سریع انجام میشه.
شناخت درست این خطا و دقت در فاصله گذاری، بخش مهمی از روش پیدا کردن و رفع خطا در کدهای ساده پایتون هست و کمک میکنه ساختار برنامه از همون ابتدا تمیز و استاندارد نوشته بشه.
خطای TypeError در پایتون و استفاده اشتباه از نوع دادهها
در ادامه بررسی انواع خطا در پایتون، بعد از آشنا شدن با خطاهایی مثل خطای NameError و خطای IndentationError در پایتون و مشکل فاصله گذاری در کد، حالا به یکی از خطاهای زمان اجرا میرسیم که بیشتر به نوع دادهها مربوط میشه، یعنی خطای TypeError در پایتون.
این خطا در پایتون زمانی رخ میده که یک عملیات روی دادهای انجام بشه که با نوع آن سازگار نیست. به بیان سادهتر، برنامه از نظر نحوی مشکلی نداره و حتی اجرا هم میشه، اما وقتی به یک عملیات مشخص میرسه، پایتون متوجه میشه نوع دادهها با هم سازگار نیستن و در نتیجه اجرای برنامه رو متوقف میکنه.
به همین دلیل TypeError معمولا همراه با Traceback در پایتون نمایش داده میشه تا مشخص بشه برنامه دقیقا در چه خطی به این مشکل برخورد کرده. اگر قبلا یاد گرفته باشیم چگونه پیام خطا در پایتون رو بخونیم، پیدا کردن چنین خطایی خیلی سریعتر انجام میشه.
ترکیب نادرست نوع دادهها
یکی از رایجترین حالتهایی که باعث خطای TypeError در پایتون و استفاده اشتباه از نوع دادهها میشه، ترکیب دادههایی هست که پایتون اجازه انجام اون عملیات رو روی اونها نمیده.
مثلا کد زیر رو در نظر بگیرین:
python
1
age = 25
2
message = "Your age is: " + age
3
print(message)
در اینجا برنامه سعی میکنه یک رشته و یک عدد رو با هم جمع کنه. در نتیجه این پیام خطا در پایتون نمایش داده میشه:
Bash
1
TypeError: can only concatenate str (not "int") to str
در فرآیند دیباگ کد پایتون وقتی چنین پیامی دیده میشه باید بررسی کنیم نوع دادههایی که در یک عملیات استفاده شدن با هم سازگار هستن یا نه.
راه ساده برای رفع خطا در پایتون در این مثال تبدیل عدد به رشته هست:
python
1
age = 25
2
message = "Your age is: " + str(age)
3
print(message)
ارسال نوع داده اشتباه به یک تابع
حالت دیگری که باعث TypeError میشه زمانی هست که یک تابع انتظار نوع خاصی از داده رو داره اما نوع دیگری بهش داده میشه. این مورد هم جزو خطاهای رایج پایتون محسوب میشه.
مثلا:
python
1
numbers = [1, 2, 3]
2
print(len(10))
تابع len() برای رشتهها، لیستها و مجموعهها استفاده میشه، اما در اینجا یک عدد بهش داده شده. در نتیجه پایتون چنین اروری نمایش میده:
Bash
1
TypeError: object of type 'int' has no len()
در چنین شرایطی Traceback در پایتون کمک میکنه خطی که باعث خطا شده سریع پیدا بشه و بتوانیم عملیات رو اصلاح کنیم.
استفاده نادرست از عملگرها روی نوع دادهها
گاهی هم خطای TypeError در پایتون زمانی رخ میده که یک عملگر روی نوع دادهای استفاده بشه که برای آن تعریف نشده.
مثلا:
python
1
result = "10" - "5"
پایتون برای رشتهها عملگر جمع رو به صورت اتصال (concatenation) تعریف کرده، اما عملگر تفریق برای رشتهها تعریف نشده. بنابراین این ارور پایتون نمایش داده میشه:
Bash
1
TypeError: unsupported operand type(s) for -: 'str' and 'str'
در این حالت برای پیدا کردن خطا در کد پایتون باید بررسی کنیم که آیا دادهها باید به عدد تبدیل بشن یا اینکه اصلا این عملیات منطقی نیست.
ارتباط خطای TypeError با سایر خطاهای پایتون
اگر بخوایم این خطا رو در کنار بقیه خطاهای پایتون درک کنیم، تفاوت آن واضحتر میشه. در خطای SyntaxError در پایتون مشکل از ساختار نوشتاری کد هست و برنامه حتی اجرا نمیشه. در خطای NameError مشکل از تعریف نبودن یک نام هست. در خطای IndentationError ساختار بلوکها اشتباه نوشته شده هست.
اما خطای TypeError در پایتون زمانی رخ میده که برنامه اجرا شده ولی نوع دادههایی که در یک عملیات استفاده شدن با هم سازگار نیستن. به همین دلیل این خطا بیشتر در دسته Runtime Error قرار میگیره که در بخش آشنایی با انواع خطا در پایتون برای مبتدیها بهش اشاره شد.
بررسی این خطا در ترمینال و VS Code
وقتی این خطا رخ میده، معمولا در بررسی خطا در ترمینال پایتون پیام کامل به همراه شماره خط نمایش داده میشه. در ابتدای پیام هم Traceback در پایتون دیده میشه که مسیر اجرای برنامه تا رسیدن به خطا رو نشون میده.
در محیطهایی مثل VS Code هم این خطا به شکل واضحتری نمایش داده میشه و حتی گاهی قبل از اجرا هم هشدارهایی درباره ناسازگاری نوع دادهها داده میشه. به همین دلیل یاد گرفتن اینکه چگونه خطاهای پایتون را در VS Code پیدا و رفع کنیم میتونه سرعت دیباگ کد پایتون رو خیلی بیشتر کنه.
جمعبندی
خطای TypeError در پایتون زمانی رخ میده که یک عملیات روی دادهای انجام بشه که با نوع آن سازگار نیست. این مشکل معمولا هنگام ترکیب نادرست رشته و عدد، ارسال نوع داده اشتباه به توابع، یا استفاده نادرست از عملگرها رخ میده.
در میان خطاهای رایج پایتون این خطا یکی از مواردی هست که در زمان اجرای برنامه دیده میشه و معمولا همراه با Traceback در پایتون و توضیح دقیق نوع دادههای درگیر نمایش داده میشه. به همین دلیل اگر بدانیم چگونه پیام خطا در پایتون رو بخوانیم، تشخیص و رفع خطا در پایتون در این موارد نسبتا سریع انجام میشه.
در عمل هم شناخت این خطا کمک میکنه هنگام نوشتن برنامه بیشتر به نوع دادهها توجه کنیم و در نتیجه فرآیند پیدا کردن و رفع خطا در کدهای ساده پایتون سریعتر و دقیقتر انجام بشه.
در ادامه بحث خطا در پایتون و بررسی چند مورد از مهمترین خطاهای پایتون مثل خطای SyntaxError، NameError، IndentationError و خطای TypeError در پایتون، حالا به خطایی میرسیم که معمولا هنگام استفاده از کتابخانهها و ماژولها دیده میشه؛ یعنی خطای ModuleNotFoundError در پایتون.
این ارور پایتون زمانی رخ میده که برنامه سعی میکنه یک ماژول یا کتابخانه رو import کنه، اما پایتون نمیتونه اون رو در محیط فعلی پیدا کنه. در چنین شرایطی اجرای برنامه متوقف میشه و پیام خطا در پایتون همراه با Traceback در پایتون نمایش داده میشه تا مشخص بشه مشکل دقیقا در چه خطی از کد رخ داده.
در واقع این خطا هم مثل بسیاری از خطاهای رایج پایتون در دسته خطاهای زمان اجرا قرار میگیره، یعنی کد از نظر ساختار مشکلی نداره اما هنگام اجرا پایتون متوجه میشه ماژول مورد نظر در دسترس نیست.
نمونهای از خطای ModuleNotFoundError در پایتون
برای درک بهتر این خطا یک مثال ساده رو در نظر بگیرین. فرض کنین داخل کد میخواهیم از کتابخانه numpy استفاده کنیم:
python
1
import numpy
2
3
print(numpy.array([1, 2, 3]))
اگر این کتابخانه روی سیستم نصب نشده باشه، هنگام اجرای برنامه این پیام خطا در پایتون نمایش داده میشه:
Bash
1
Traceback (most recent call last):
2
File "test.py", line 1, in <module>
3
import numpy
4
ModuleNotFoundError: No module named 'numpy'
در اینجا متوجه میشیم خطا دقیقا در خط اول برنامه اتفاق افتاده. بنابراین برای پیدا کردن خطا در کد پایتون باید بررسی کنیم که آیا ماژول مورد نظر واقعا نصب شده یا نه.
اشتباه تایپی در نام ماژول
یکی از دلایل رایج خطای ModuleNotFoundError در پایتون و مشکل import ماژول، اشتباه تایپی در نام کتابخانه هست.
مثلا:
python
1
import numppy
در حالی که نام درست کتابخانه numpy هست. در این حالت هم پایتون همون ارور پایتون رو نمایش میده چون ماژولی با آن نام وجود نداره.
در چنین شرایطی برای دیباگ کد پایتون کافی هست نام ماژول رو بررسی کنیم و اون رو اصلاح کنیم.
نصب نبودن کتابخانه در محیط پایتون
دلیل رایج دیگر این خطا نصب نبودن کتابخانه در محیط فعلی پایتون هست. بسیاری از کتابخانهها مثل numpy، pandas یا requests به صورت پیشفرض همراه پایتون نصب نمیشن و باید جداگانه نصب بشن.
برای رفع خطا در پایتون در چنین شرایطی میشه از pip استفاده کرد:
Bash
1
pip install numpy
بعد از نصب کتابخانه، اگر دوباره برنامه اجرا بشه دیگه خطای ModuleNotFoundError در پایتون نمایش داده نمیشه.
این نوع مشکل معمولا هنگام بررسی خطا در ترمینال پایتون خیلی سریع مشخص میشه، چون پیام کامل خطا همونجا نمایش داده میشه.
تفاوت ModuleNotFoundError با سایر خطاهای پایتون
برای درک بهتر جایگاه این خطا در میان انواع خطا در پایتون بهتر هست اون رو با چند خطای دیگه مقایسه کنیم.
در خطای SyntaxError در پایتون مشکل از ساختار نوشتن کد هست و برنامه اصلا اجرا نمیشه. در خطای NameError در پایتون مشکل از استفاده از یک نام تعریف نشده هست. در خطای TypeError در پایتون و استفاده اشتباه از نوع دادهها عملیات روی نوع داده نامناسب انجام میشه.
اما در خطای ModuleNotFoundError در پایتون مشکل به ماژولها مربوط هست؛ یعنی پایتون نمیتونه کتابخانهای که در کد import شده رو پیدا کنه.
به همین دلیل این خطا بیشتر زمانی دیده میشه که برنامهنویس شروع به استفاده از کتابخانههای خارجی میکنه.
بررسی این خطا در VS Code
وقتی برنامه در محیطهایی مثل VS Code اجرا میشه، ارور پایتون در VS Code معمولا در بخش ترمینال یا پنل Problems نمایش داده میشه. در این حالت هم Traceback در پایتون مسیر اجرای برنامه تا محل خطا رو نشون میده.
اگر بدونیم چگونه خطاهای پایتون رو در VS Code پیدا و رفع کنیم، معمولا با نگاه کردن به خطی که import در اون نوشته شده میشه خیلی سریع متوجه شد مشکل از نصب نبودن کتابخانه هست یا از اشتباه نوشتن نام آن.
جمعبندی
خطای ModuleNotFoundError در پایتون زمانی رخ میده که برنامه تلاش میکنه یک ماژول رو import کنه اما پایتون نمیتونه اون رو در محیط فعلی پیدا کنه. این مشکل معمولا به دلیل نصب نبودن کتابخانه، اشتباه تایپی در نام ماژول یا استفاده از محیط پایتون متفاوت ایجاد میشه.
در میان خطاهای رایج پایتون این خطا بیشتر زمانی دیده میشه که برنامهنویس شروع به استفاده از کتابخانهها میکنه. در چنین شرایطی پیام خطا در پایتون همراه با Traceback نمایش داده میشه و کمک میکنه محل دقیق خطا مشخص بشه تا فرآیند دیباگ کد پایتون و رفع خطا در پایتون سریعتر انجام بشه.
بعد از اینکه با چند مورد از خطاهای رایج پایتون مثل خطای SyntaxError در پایتون، خطای NameError در پایتون، خطای IndentationError در پایتون، خطای TypeError در پایتون و همینطور خطای ModuleNotFoundError در پایتون آشنا شدیم، قدم بعدی این هست که یاد بگیریم روش پیدا کردن و رفع خطا در کدهای ساده پایتون چطور انجام میشه.
در عمل، دیدن یک خطا در پایتون چیز عجیبی نیست. تقریبا در هر برنامهای ممکن هست ارور پایتون رخ بدهد. چیزی که مهم هست این هست که بدونیم چطور با استفاده از پیام خطا در پایتون و اطلاعاتی که Traceback در پایتون در اختیار ما میزاره، محل مشکل رو پیدا کنیم و اون رو اصلاح کنیم. به این فرآیند دیباگ کد پایتون گفته میشه.
از پایین پیام خطا شروع کنین
یکی از مهمترین نکاتی که هنگام پیدا کردن خطا در کد پایتون باید بهش توجه کنیم این هست که همیشه آخرین خط پیام خطا رو اول بررسی کنیم. دلیلش این هست که در بیشتر مواقع نوع خطا در همون قسمت نوشته میشه.
مثلا اگر چنین پیامی ببینیم:
Bash
1
Traceback (most recent call last):
2
File "test.py", line 3, in <module>
3
print(age)
4
NameError: name 'age' is not defined
در اینجا خیلی سریع متوجه میشویم که مشکل مربوط به خطای NameError در پایتون هست و متغیر age قبل از استفاده تعریف نشده.
پس اولین قدم در دیباگ کد پایتون این هست که نوع خطا رو تشخیص بدیم.
از پایین پیام خطا شروع کنین
مرحله بعدی در روش پیدا کردن و رفع خطا در کدهای ساده پایتون این هست که به خطی نگاه کنیم که در Traceback در پایتون مشخص شده. معمولا شماره خط در پیام خطا نوشته میشه.
مثلا:
Bash
1
File "test.py", line 5
این یعنی مشکل در خط پنجم برنامه رخ داده. در این مرحله باید بررسی کنیم آیا یکی از خطاهای پایتون که قبلا یاد گرفتیم در آن خط وجود داره یا نه.
برای مثال ممکن هست با یکی از این موارد روبهرو بشیم:
- فراموش کردن چیزی در کد: که باعث خطای SyntaxError در پایتون میشه
- تعریف نشدن: متغیر که منجر به خطای NameError در پایتون میشه
- فاصله گذاری اشتباه: که باعث خطای IndentationError در پایتون میشه
- ناسازگاری نوع دادهها: که باعث خطای TypeError در پایتون میشه
به همین دلیل شناخت انواع خطا در پایتون کمک میکنه سریعتر مشکل رو تشخیص بدیم.
سادهسازی کد برای پیدا کردن مشکل
یکی از روشهایی که در دیباگ کد پایتون زیاد استفاده میشه این هست که کد رو سادهتر کنیم تا بفهمیم دقیقا کدام بخش باعث ارور پایتون شده.
مثلا اگر برنامه بزرگتر باشه میتونیم موقتا بعضی بخشها رو حذف کنیم یا از print() استفاده کنیم تا ببینیم مقدار متغیرها چه چیزی هست.
python
1
price = "100"
2
tax = 20
3
4
print(price)
5
print(tax)
6
7
total = price + tax
8
print(total)
وقتی برنامه اجرا بشه ممکن هست خطای TypeError در پایتون نمایش داده بشه. در این حالت با دیدن مقدار متغیرها سریع متوجه میشیم که price رشته هست و باید اون رو به عدد تبدیل کنیم.
این روش ساده یکی از تکنیکهای رایج برای پیدا کردن خطا در کد پایتون هست.
استفاده از ترمینال و محیط توسعه
در بیشتر مواقع بررسی خطا در ترمینال پایتون سادهترین روش برای دیدن پیام خطا در پایتون هست، چون پیام کامل به همراه Traceback نمایش داده میشه.
در محیطهایی مثل VS Code هم وقتی برنامه اجرا میشه، ارور پایتون در VS Code داخل ترمینال داخلی نمایش داده میشه. اگر بدونیم چگونه خطاهای پایتون رو در VS Code پیدا و رفع کنیم، معمولا میتونیم با کلیک روی شماره خط مستقیما به محل مشکل بریم.
به همین دلیل بیشتر برنامهنویسها هنگام دیباگ کد پایتون از همین ابزارها استفاده میکنن.
اشتباهات سادهای که باعث خطا میشن
در بسیاری از مواقع خطاهای مبتدیان در پایتون خیلی پیچیده نیستند و بیشتر به اشتباهات ساده مربوط میشن. مثلا:
- اشتباه نوشتن نام متغیر
- فراموش کردن پرانتز
- فاصله گذاری اشتباه در بلوکها
- اشتباه در نوع دادهها
این موارد همون خطاهای رایج پایتون هستن که تقریبا هر برنامهنویسی در مراحل اولیه باهاش مواجه میشه.
جمعبندی
وقتی یک خطا در پایتون رخ میده، مهمترین کار این هست که به پیام خطا در پایتون توجه کنیم و اطلاعاتی که Traceback در پایتون ارائه میده رو بررسی کنیم. این اطلاعات مشخص میکنه خطا در کدوم خط برنامه رخ داده و نوع خطا چیست.
با شناخت انواع خطا در پایتون مثل SyntaxError، NameError، IndentationError، TypeError و ModuleNotFoundError میشه خیلی سریعتر فرآیند پیدا کردن خطا در کد پایتون رو انجام داد. در نهایت با اصلاح همون بخش از کد، فرآیند رفع خطا در پایتون کامل میشه و برنامه بدون مشکل اجرا خواهد شد.
بعد از اینکه فهمیدیم خطا در پایتون چیست و چرا هنگام اجرای کد رخ میده و با انواع خطا در پایتون اشنا شدیم، حالا وقتشه یک نگاه عملیتر داشته باشیم به این موضوع که اصلا چرا افراد تازهکار بیشتر با ارور پایتون روبهرو میشن.
بیشتر خطاهای مبتدیان در پایتون به خاطر پیچیدگی زبان نیست، بلکه به خاطر بیدقتی، عجله یا درک ناقص از مفاهیم پایه هست. این اشتباهات معمولا منجر به یکی از همون خطاهای رایج پایتون میشن که قبلا بررسی کردیم.
استفاده از متغیر قبل از تعریف
یکی از شایعترین مواردی که باعث خطا در پایتون میشه، استفاده از متغیری هست که هنوز تعریف نشده. این مورد مستقیما منجر به خطای NameError در پایتون میشه.
python
1
print(score)
2
score = 100
در این حالت هنگام اجرا، پیام خطا در پایتون نمایش داده میشه و در انتهای اون میبینیم:
Bash
1
NameError: name 'score' is not defined
اگر بلد باشیم چگونه پیام خطا در پایتون را بخوانیم خیلی سریع متوجه میشیم که ترتیب تعریف متغیر اشتباه بوده.
بیتوجهی به فاصله گذاری
پایتون نسبت به تورفتگی حساس هست و همین موضوع یکی از دلایل اصلی خطای IndentationError در پایتون و مشکل فاصله گذاری در کد هست. خیلی از مبتدیها این موضوع رو جدی نمیگیرن.
python
1
if 5 > 2:
2
print("ok")
این کد باعث خطای IndentationError در پایتون میشه چون بدنه شرط تورفته نشده. این مورد جزو واضحترین اشتباهات رایج مبتدیها که باعث ارور در پایتون میشه محسوب میشه.
اشتباه در نوع دادهها
یکی دیگر از موارد پرتکرار، ترکیب اشتباه نوع دادههاست که منجر به خطای TypeError در پایتون و استفاده اشتباه از نوع دادهها میشه.
python
1
age = "20"
2
print(age + 5)
در اینجا چون یکی رشته و دیگری عدد هست، برنامه با خطای TypeError در پایتون متوقف میشه. این نوع اشتباه معمولا زمانی رخ میده که برنامهنویس هنوز درک دقیقی از تفاوت بین str و int نداره.
فراموش کردن import یا نصب کتابخانه
بسیاری از تازهکارها وقتی با کتابخانهها کار میکنن، یا نام اون رو اشتباه مینویسن یا اون رو نصب نکردن. این موضوع منجر به خطای ModuleNotFoundError در پایتون و مشکل import ماژول میشه.
python
1
import panda
در حالی که نام درست pandas هست. این هم یکی از خطاهای مبتدیان در پایتون هست که با کمی دقت قابل پیشگیری هست.
اشتباهات ساده در سینتکس
فراموش کردن علامت : بعد از if یا for، نبستن پرانتز، یا استفاده اشتباه از = به جای == باعث خطای SyntaxError در پایتون میشه. این موارد همون رایجترین خطاهای SyntaxError در پایتون هستن که معمولا با دقت در نوشتن کد برطرف میشن.
مثلا:
python
1
if x == 10
2
print("hi")
اینجا فقط یه علامت : جا افتاده اما برنامه کاملا متوقف میشه و Traceback در پایتون نمایش داده میشه.
نخواندن کامل پیام خطا
یکی از مهمترین اشتباهات این هست که مبتدیها فقط کد رو نگاه میکنن و پیام خطا در پایتون رو دقیق نمیخونن. در حالی که معمولا جواب داخل همون پیام نوشته شده.
علت نمایش Traceback در پایتون هنگام اجرای برنامه این هست که مسیر اجرای کد رو نشون بده تا ما بتونیم دقیق بفهمیم مشکل از کجاست. اگر این بخش نادیده گرفته بشه، فرآیند پیدا کردن خطا در کد پایتون سختتر میشه.
اجرا در محیط اشتباه
گاهی اوقات ارور پایتون در VS Code به این دلیل دیده میشه که مفسر انتخاب شده با محیطی که کتابخانه در آن نصب شده متفاوت هست. این مورد هم یکی از خطاهای رایج پایتون برای افراد تازهکار هست.
جمعبندی
بیشتر خطاهای پایتون که برای افراد تازهکار رخ میدن، ناشی از اشتباهات سادهای مثل تعریف نکردن متغیر، فاصله گذاری اشتباه، بیتوجهی به نوع دادهها یا نصب نبودن کتابخانههاست. این موارد همون اشتباهات رایج مبتدیها که باعث خطا در پایتون میشه هستن.
اگر بدونیم انواع خطا در پایتون چه هستن و عادت کنیم همیشه پیام خطا در پایتون و Traceback در پایتون رو با دقت بخونیم، فرآیند دیباگ کد پایتون و در نهایت رفع خطا در پایتون خیلی سریعتر و حرفهایتر انجام میشه.
وقتی در حال برنامهنویسی هستیم، دیدن خطا در پایتون یک اتفاق کاملا طبیعی هست. چیزی که اهمیت داره این هست که بدونیم چطور این خطاها رو بررسی کنیم و از اطلاعاتی که پیام خطا در پایتون و Traceback در پایتون به ما میده برای پیدا کردن خطا در کد پایتون استفاده کنیم.
در عمل، دو محیط اصلی برای این کار وجود داره: اجرای برنامه در ترمینال و اجرای اون در یک محیط توسعه مثل VS Code. هر دو روش به ما کمک میکنن انواع مختلف خطاهای پایتون مثل خطای SyntaxError در پایتون، خطای NameError در پایتون یا خطای TypeError در پایتون رو ببینیم و برای رفع خطا در پایتون اقدام کنیم.
بررسی خطا در ترمینال پایتون
یکی از سادهترین روشها برای دیدن خطاهای پایتون اجرای مستقیم برنامه در ترمینال هست. در این حالت اگر برنامه مشکلی داشته باشه، پایتون بلافاصله پیام خطا در پایتون رو همراه با Traceback نمایش میده.
فرض کنین فایل زیر رو داریم:
test.py
1
x = 10
2
print(y)
اگر این فایل رو در ترمینال اجرا کنیم:
Bash
1
python test.py
خروجی چیزی شبیه این خواهد بود:
Bash
1
Traceback (most recent call last):
2
File "test.py", line 2, in <module>
3
print(y)
4
NameError: name 'y' is not defined
اینجا چند نکته مهم وجود داره. اول اینکه Traceback در پایتون نشون میده خطا در کدوم فایل و کدوم خط رخ داده. دوم اینکه در آخر پیام مشخص میشه با خطای NameError در پایتون روبهرو هستیم.
در واقع همین اطلاعات پایهایترین ابزار برای دیباگ کد پایتون محسوب میشه.
چرا Traceback هنگام اجرای برنامه نمایش داده میشود
هدف این بخش در واقع کمک به برنامهنویس برای پیدا کردن مسیر اجرای برنامه هست.
Traceback نشان میده برنامه چطور به خطی رسیده که در آن خطای پایتون رخ داده. اگر یاد گرفته باشیم چگونه پیام خطا در پایتون را بخوانیم، معمولا خیلی سریع میتونیم مشکل رو پیدا کنیم.
بررسی ارور پایتون در VS Code
در کنار ترمینال، بسیاری از برنامهنویسها از محیطهای توسعه مثل Visual Studio Code استفاده میکنن. در این محیط وقتی برنامه اجرا میشه، اگر مشکلی در کد وجود داشته باشه ارور پایتون در VS Code در ترمینال داخلی نمایش داده میشه.
از نظر فنی همون پیام خطا در پایتون و Traceback نمایش داده میشه، اما VS Code چند قابلیت اضافه هم داره که فرآیند دیباگ کد پایتون رو سادهتر میکنه.
مثلا وقتی خطایی مثل خطای SyntaxError در پایتون یا خطای IndentationError در پایتون رخ بده، VS Code معمولا همون خط رو با رنگ مشخص میکنه و گاهی حتی پیشنهاد اصلاح هم میده.
استفاده از اطلاعات خط خطادار
چه در ترمینال و چه در VS Code، مهمترین اطلاعاتی که برای رفع خطا در پایتون داریم شماره خط و نوع خطاست. این اطلاعات کمک میکنن سریع بفهمیم با کدوم یک از انواع خطا در پایتون روبهرو هستیم.
برای مثال ممکن هست با این موارد مواجه بشیم:
- خطای SyntaxError در پایتون به دلیل اشتباه در سینتکس
- خطای IndentationError در پایتون به دلیل مشکل فاصله گذاری
- خطای TypeError در پایتون به دلیل استفاده اشتباه از نوع دادهها
- خطای ModuleNotFoundError در پایتون به دلیل مشکل import ماژول
اینها همون خطاهای رایج پایتون هستن که مخصوصا در مراحل اولیه یادگیری زیاد دیده میشن.
نقش ترمینال و VS Code در فرآیند دیباگ
در عمل، ترمینال و VS Code هر دو فقط ابزار نمایش ارور پایتون هستن. اصل کار مربوط به مهارتی هست که برنامهنویس در تحلیل پیام خطا در پایتون و درک Traceback در پایتون داره.
اگر کسی بدونه خطا در پایتون چیست و چرا هنگام اجرای کد رخ میده و همینطور با آشنایی با انواع خطا در پایتون برای مبتدیها جلو اومده باشه، معمولا خیلی سریعتر میتونه مشکل رو تشخیص بدهد.
جمعبندی
برای بررسی خطاهای پایتون معمولا از دو محیط اصلی استفاده میشه: بررسی خطا در ترمینال پایتون و مشاهده ارور پایتون در VS Code. در هر دو حالت، پایتون اطلاعاتی مثل پیام خطا در پایتون و Traceback در پایتون رو نمایش میده که به ما کمک میکنه محل مشکل رو پیدا کنیم.
اگر بتونیم این اطلاعات رو درست تحلیل کنیم، فرآیند دیباگ کد پایتون و در نهایت رفع خطا در پایتون بسیار سریعتر انجام میشه