برنامه میایستد و ترمینال پر از خط قرمز میشود. خیلیها از بالا میخوانند و گیج میشوند. آن خطهای اول معمولاً مال کتابخانهاند، نه مال فایل خودتان. خطای پایتون را از پایین پیام بخوانید. آخرین File همان جایی است که کار خراب شد. بعد نوع خطا را نگاه کنید.
خطای پایتون را از پایین شروع کنید
پیام قرمز همان traceback است؛ زنجیرهٔ خطهایی که میگوید برنامه از کجا آمد. از یک فایل به فایل بعد میرود تا برسد به جایی که واقعاً شکست. جای شکست ته پیام است، نه سرش.
اگر از بالا شروع کنید، ممکن است داخل پوشهٔ کتابخانهها بروید. آن فایلها مال پروژه شما نیستند. دستکاریشان معمولاً لازم نیست. کار شما همان آخرین File است که اسم پوشهٔ خودتان را دارد.
سه چیز را از ته پیام بردارید: مسیر File، شماره line، و نوع Error. همین سه تا برای بیشتر روزها کافی است.
File، شماره خط، بعد نوع خطا
File میگوید کدام فایل باز بوده. line میگوید کدام خط. نوع خطا یک کلمه انگلیسی است که ته پیام میآید. NameError یعنی اسمی را صدا زدید که تعریف نشده؛ اغلب یک حرف را اشتباه تایپ کردهاید. TypeError یعنی نوع داده جور نیست؛ مثلاً عدد را با متن جمع کردهاید. FileNotFoundError یعنی فایل روی دیسک نیست یا مسیر را غلط نوشتهاید. ModuleNotFoundError یعنی کتابخانه نصب نیست یا اسم ماژول غلط است.
- ترمینال را تا ته ببرید. چشم را از آخرین خط شروع کنید، نه از کلمه Traceback بالای صفحه.
- آخرین خطی که با File شروع میشود پیدا کنید. مسیر فایل و شماره line همانجاست.
- دو سه خط پایینتر نوع Error را بخوانید. همان NameError یا FileNotFoundError معمولاً کار را روشن میکند.
- در VS Code همان فایل را باز کنید. روی شماره خط بزنید، یا Ctrl را نگه دارید و روی مسیر داخل ترمینال بزنید.
- همان خط را با پیام مقایسه کنید. اگر اسم فایل یا متغیر فرق دارد، اول همان را درست کنید. کل پروژه را از نو ننویسید.
اگر همین حالا یک پیام قرمز در ترمینال دارید، فقط ته آن را نگاه کنید و بگویید آخرین File مال پروژه خودتان بود یا مال کتابخانه.
یک مثال کوتاه: فایل نیست یا اسم را اشتباه نوشتید
فرض کنید اسکریپت میخواهد فایل data.txt را باز کند. فایل در پوشه نیست. ته پیام چیزی شبیه این میآید:
FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'
از بالا لازم نیست بخوانید. همین یک خط میگوید فایل پیدا نشد. پوشه را نگاه کنید. اسم را چک کنید. شاید data.csv است، نه data.txt. شاید فایل یک پوشه بالاتر است. مسیر را همانجا درست کنید و دوباره اجرا کنید.
مثال دوم غلط املایی است. نوشتید prinnt به جای print. ته پیام NameError میآید و اسم prinnt را نشان میدهد. خط File همان خط اسکریپت شماست. در ویرایشگر همان خط را باز کنید. یک حرف اضافه را بردارید. دوباره اجرا کنید.
اگر TypeError دیدید، ببینید چه چیزی را با چه چیزی قاطی کردهاید. عدد و متن را نمیشود همینطور جمع کرد. اگر ModuleNotFoundError آمد، اسم ماژول را با چیزی که نصب کردهاید مقایسه کنید. گاهی requests نصب است ولی در کد request نوشتهاید. یک حرف کم همان خطا را میسازد.
در VS Code روی همان خط بزنید
VS Code مسیر File را در ترمینال لینک میکند. Ctrl را نگه دارید و روی آن خط بزنید. ویرایشگر همان فایل را همان شماره خط باز میکند. لازم نیست مسیر را دستی در درخت پوشه پیدا کنید.
اگر لینک کار نکرد، فایل را از نوار کناری باز کنید و به شماره line بروید. در ویندوز Ctrl+G شماره خط را میپرسد. در لینوکس و مک هم همین میانبر معمولاً کار میکند.
بعد از باز شدن خط، فقط همان را عوض کنید. اگر خطا از مسیر فایل بود، همان رشته را درست کنید. اگر از اسم تابع بود، املا را با تعریف مقایسه کنید. یک تغییر کوچک، بعد یک اجرای تازه. اگر باز خطا آمد، دوباره ته پیام را بخوانید. شاید نوع Error عوض شده باشد. اگر شماره خط فرق داشت، اول فایل را ذخیره کنید. پایتون نسخهٔ روی دیسک را میخواند، نه متن ذخیرهنشده.
رمز و توکن را جایی نگذارید
گاهی در پیام مسیر پوشه کاربر، نام حساب، یا حتی مقدار یک متغیر دیده میشود. اگر آن متغیر توکن یا رمز است، عکس صفحه را در گروه عمومی نفرستید. لاگ کامل را هم در چت نگذارید. برای همکار همان سه چیز کافی است: File، شماره خط، نوع Error.
اگر خواستید از کسی کمک بگیرید، رمز، کلید API و محتوای فایل env را پاک کنید. این کار را خودتان بکنید، قبل از فرستادن. اول ته پیام را بخوانید. خیلی وقتها همان FileNotFoundError یا NameError را خودتان در یک دقیقه درست میکنید. لازم نیست اول راه پیام را برای مدل هوش مصنوعی بفرستید.
آخرین نوعی که در ته پیام دیدید NameError بود یا FileNotFoundError؟