اشکال زدایی و مدیریت خطا در پایتون GIS – فصل 7
7.1معرفی
این فصل رویه های اشکال زدایی را مورد بحث قرار می دهد و مروری بر رایج ترین خطاهای پایتون ارائه می دهد. رویههای رسیدگی به خطا نیز مورد بحث قرار میگیرند، از جمله اینکه چگونه میتوان بیشترین بهره را بردسعی کنید-به جزبیانیه.
مهم نیست که چقدر در نوشتن کد دقت کنید، حتماً خطاهایی رخ می دهد. سه نوع اصلی خطا در پایتون وجود دارد: خطاهای نحوی، استثناها و خطاهای منطقی. خطاهای نحوی در وهله اول از اجرای کد جلوگیری می کند. هنگامی که یک استثنا رخ می دهد، یک اسکریپت اجرای midprocess را متوقف می کند. یک خطای منطقی به این معنی است که اسکریپت اجرا می شود اما نتایج نامطلوبی ایجاد می کند. خطاهای نحوی و استثناها با استراتژی هایی در مورد نحوه رسیدگی به آنها بررسی می شوند.
7.2کار با خطاهای نحوی
خطاهای نحویمربوط به املا، علائم نگارشی، تورفتگی و سایر قراردادهای زبان پایتون است. خطاهای نحوی رایج ناشی از غلط املایی کلمات کلیدی یا متغیرها، از دست دادن علائم نگارشی و تورفتگی ناسازگار است. ببینید آیا می توانید خطا را در کد زیر تشخیص دهید:
واردات کمان
arcpy.env.workspace = “C:/Data/mydata.gdb”
fclist = arcpy.ListFeatureClasses()
برای fc در fclist
count = arcpy.GetCount_management(fc)
چاپ (شمارش)
کولون در انتهای خط اول ازبرایحلقه گم شده است هنگامی که می خواهید این کد را اجرا کنید، خطای نحوی زیر نمایش داده می شود:
SyntaxError: نحو نامعتبر است
IDEهای پایتون دارای فرآیندهای بررسی داخلی هستند که تا حدودی مانند یک غلطگیر املا در برنامههای پردازش کلمه کار میکنند. نمونه اسکریپت را در IDLE در نظر بگیرید.
شرح
پنجره اسکریپت در IDLE با همان کدی که در متن نوشته شده است – یعنی با یک دونقطه در انتهای خط اولبرایحلقه
از منوی بالا، روی Run > Check Module کلیک کنید. این فرآیند بدون اجرای کد یک بررسی نحوی انجام می دهد. یک کادر محاوره ای پاپ آپ ظاهر می شود که خطای نحوی را گزارش می کند.
شرح
کادر محاورهای بازشو به نام SyntaxError با پیامی مبنی بر گزارش ” نحو نامعتبر “.
در خود اسکریپت، محل خطای نحوی نیز به صورت نوار قرمز نشان داده شده است.
شرح
پنجره اسکریپت در IDLE با همان کد موجود در متن، که یک نوار افقی قرمز رنگ در انتهای خط 4 نشان می دهد تا محل خطای نحوی را نشان دهد.
بررسی خطا دقیقاً به شما نمی گوید که خطا چیست (یعنی یک دونقطه از دست رفته)، فقط محل خطای نحوی را نشان می دهد.
توجه داشته باشید:هیچ گزینه ای در IDLE برای نمایش اعداد خط در یک اسکریپت وجود ندارد، که این ویژگی معمولی برای اکثر ویرایشگرهای پایتون، از جمله Spyder و PyCharm است.
با تغییر خط 4 به کد زیر، خطای نحو برطرف می شود:
برای fc در fclist:
وقتی روی Run > Check Module کلیک می کنید، هیچ پیام خطایی ظاهر نمی شود و مترجم تعاملی باز می شود. این بدان معناست که اسکریپت آماده اجرا است.
بررسی خطای اصلی همچنین شامل تورفتگی و فاصله است. به عنوان مثال، بلوک کد زیر از تورفتگی ناسازگار استفاده می کند:
برای fc در fclist:
count = arcpy.GetCount_management(fc)
چاپ (شمارش)
با بررسی این کد در IDLE پیام زیر تولید می شود:
SyntaxError: تورفتگی غیرمنتظره
اگر تورفتگی شما از ترکیبی از فاصله ها و زبانه ها استفاده کند، خطاهای مشابهی ممکن است رخ دهد. به خصوص هنگامی که از منابع دیگر مانند Microsoft Word، Microsoft PowerPoint یا Adobe PDF کپی می کنید، ممکن است بلوک های کد از نظر بصری به درستی تورفتگی داشته باشند اما ممکن است از ترکیبی از فضاها و برگه ها استفاده کنند.
توجه داشته باشید:اگرچه خطاهای تورفتگی محتمل ترین نوع خطا هنگام کپی کد از منابع دیگر مانند فایل های Word و PDF هستند، کپی کردن کد احتمالاً انواع دیگری از خطاها از جمله نقل قول ها را نیز معرفی می کند. بنابراین به طور کلی کپی کد از این نوع فایل ها توصیه نمی شود. اگر این کار را می کنید، حتماً تورفتگی، فاصله، ادامه خط و نقل قول را به دقت بررسی کنید.
سایر IDE ها عملکرد مشابهی برای بررسی نحوی اولیه دارند. به عنوان مثال، Spyder هنگام نوشتن اسکریپت خود، خطاهای نحوی را به طور خودکار نمایش می دهد. در مثال، یک نقطه قرمز کوچک با یک ضربدر سفید در سمت چپ شماره خط ظاهر می شود. با نگه داشتن ماوس روی این نماد، یک پنجره پاپ آپ با پیام “invalid syntax” ظاهر می شود.
شرح
پنجره اسکریپت در Spyder با همان کدی که در مثالهای قبلی وجود داشت، نشاندهنده یک نماد خطا در سمت چپ خط 4 و یک پنجره بازشو که “سینتکس نامعتبر” را گزارش میدهد.
به طور مشابه، تورفتگی ناسازگار یک پیام هشدار ایجاد می کند: “تورفتگی غیرمنتظره”. یکی از مزایای استفاده از ویرایشگری مانند Spyder این است که این خطاها و هشدارها بلافاصله هنگام نوشتن کد خود ظاهر می شوند که یک ابزار یادگیری عالی است.
شرح
پنجره اسکریپت در Spyder با همان کدی که در مثالهای قبلی وجود داشت، نشاندهنده یک علامت هشدار در سمت چپ خط 6 و یک پنجره بازشو که “تورفتگی غیرمنتظره” را گزارش میدهد.
بررسی خطای نحوی در PyCharm نیز با نوشتن کدتان انجام میشود، اما نمایشگر ظریفتر است. خطاهای نحوی به صورت یک خط قرمز قرمز نشان داده می شوند، همانطور که خطاهای املایی در Microsoft Word (در میان سایر برنامه ها) نشان داده می شوند. این می تواند نمایشگر را به سختی ببیند زیرا اغلب خطای نحوی تنها یک کاراکتر عرض دارد.
شرح
پنجره اسکریپت در PyCharm با همان کدی که در مثالهای قبلی وجود داشت، که یک خط قرمز قرمز را در انتهای خط اول نشان میدهد.برایحلقه
علاوه بر این، تم صفحه نمایش محبوب Darcula (پس زمینه تیره، کد روشن) تشخیص این رنگ ها را تا حدودی دشوار می کند. تم نمایش پیش فرض (پس زمینه روشن، کد تیره) استفاده شده در شکل ها معمولاً دیدن این رنگ ها را آسان تر می کند.
هنگامی که مکان نما خود را در نقطه خطای نحوی قرار می دهید، این خطا در گوشه سمت چپ پایین برنامه در نوار وضعیت ظاهر می شود. هنگامی که با مکان نما خود روی نقطه خطای نحو مکث می کنید، یک پنجره پاپ آپ با خطای نحو نیز ظاهر می شود.
شرح
پنجره اسکریپت در PyCharm با همان کدی که در مثالهای قبلی وجود داشت، یک پنجره بازشو با پیام «Colon expected» نشان میدهد.
تشخیص خطاهای نحوی هنگام نوشتن کد می تواند مفید باشد. علاوه بر این، PyCharm می تواند گزارشی با تمام خطاها و هشدارهای یک اسکریپت ایجاد کند. از منوی بالا، روی Code > Inspect Code کلیک کنید و سپس اسکریپت فعلی را انتخاب کنید. اسکریپت زیر را با دو خطای نحوی در نظر بگیرید:
واردات کمان
arcpy.env.workspace = “C:/Data/mydata.gdb”
fclist = arcpy.ListFeatureClasses()
برای fc در fclist
count = arcpy.GetCount_management(fc)
چاپ (شمارش)
بازرسی کد PyCharm نتایج نشان داده شده در شکل را ایجاد می کند.
نتایج بازرسی شامل دو خطای نحوی یک دونقطه از دست رفته و تورفتگی ناسازگار، اما همچنین چندین اخطار و مشکلات املایی است. اگرچه ممکن است این مشکلات توجه را جلب کند، اما مانع از اجرای کد نمی شود. برخی از اخطارها تکراری از خطاهای نحوی هستند، در حالی که برخی از مشکلات املایی مربوط به نام مجموعه داده ها و/یا متغیرهایی است که قوانین املایی معمولی برای آنها اعمال نمی شود.
یکی دیگر از ویژگی های مفید PyCharm در این زمینه این است که سازگاری داخلی نام متغیرها را بررسی می کند. کد زیر را در نظر بگیرید:
واردات کمان
arcpy.env.workspace = “C:/Data/mydata.gdb”
fclist = arcpy.ListFeatureClasses()
برای fc در mylist:
count = arcpy.GetCount_management(fc)
چاپ (شمارش)
هیچ مشکل نحوی وجود ندارد، اما متغیر استfclistدر خط 3 مقداری به آن اختصاص داده شده است و به اشتباه به آن اشاره می شودلیست مندر خط 4. نام این متغیر یک خطای نحوی نیست و مانع از اجرای کد نمی شود. با این حال، کد به درستی اجرا نمی شود زیرالیست منارزشی داده نشده است PyCharm این مشکل را به عنوان یک مرجع حل نشده گزارش می کند.
شرح
پنجره اسکریپت در PyCharm با همان کدی که در متن وجود دارد، یک پنجره بازشو با پیام “مرجع حل نشده “mylist” را نشان می دهد.
مانند خطاهای نحوی، بازخورد دقیقاً به شما نمی گوید که چگونه مشکل را برطرف کنید، اما شما را در جهت درست راهنمایی می کند. Spyder دارای همان ویژگی داخلی است و متغیر را علامت گذاری می کندلیست منبه عنوان یک “نام تعریف نشده”.
ویژگیهای داخلی بررسی کد مانند مواردی که توسط Spyder و PyCharm ارائه شدهاند، این ویرایشگرها را در مقایسه با IDLE که فقط خطاهای نحوی را تشخیص میدهد، همه کارهتر میکند.
7.3تشخیص استثناها
خطاهای نحوی ناامید کننده هستند، اما در مقایسه با سایر خطاها نسبتاً آسان به دست می آیند. مثال زیر را در نظر بگیرید که نحو تصحیح شده است:
واردات کمان
arcpy.env.workspace = “C:/Data/mydata.gdb”
fclist = arcpy.ListFeatureClasses()
برای fc در fclist:
count = arcpy.GetCount_management(fc)
چاپ (شمارش)
وقتی اسکریپت را دوباره اجرا می کنید، بدون خطای نحوی اجرا می شود. اما اگر تعداد چاپ نشده باشد چه؟ آیا این یک خطا است؟ شاید فضای کاری نادرست باشد یا شاید هیچ کلاس ویژگی در فضای کاری وجود نداشته باشد. شاید کلاس های ویژگی همه خالی باشند؟
زبانهای برنامهنویسی بهجای اشاره به این حوادث بهعنوان «خطا»، معمولاً بین روند عادی رویدادها و چیزهای استثنایی تشخیص میدهند. ممکن است خطاهایی وجود داشته باشد، یا ممکن است به سادگی رویدادهایی وجود داشته باشد که شما پیش بینی نکرده اید. این رویدادها استثنا نامیده می شوند. استثناها به خطاهایی اشاره دارند که در حین اجرای اسکریپت شناسایی می شوند. هنگامی که یک استثنا شناسایی می شود، اسکریپت اجرا نمی شود مگر اینکه استثنا به درستی مدیریت شود. به استثناها گفته میشود که «پرتاب میشوند»، همانطور که در «اسکریپت یک استثنا ایجاد میکند». اگر استثنا به درستی مدیریت شود – یعنی “گرفته شود” – برنامه می تواند به اجرا ادامه دهد. بخشهای بعدی این فصل نمونههایی از استثناها و تکنیکهای مناسب رسیدگی به خطا را ارائه میکنند.
7.4استفاده از اشکال زدایی
هنگامی که کد منجر به استثنا یا خطاهای منطقی می شود، ممکن است لازم باشد مقادیر متغیرهای موجود در اسکریپت خود را با دقت بیشتری بررسی کنید، که می تواند با استفاده از یک روش اشکال زدایی انجام شود. اشکال زدایی یک فرآیند روش شناختی برای یافتن خطاها در اسکریپت شما است. چندین روش ممکن برای اشکال زدایی وجود دارد، از ابتدایی تا پیچیده. روش های اشکال زدایی شامل موارد زیر است:
- بررسی دقیق محتوای پیام های خطا
- اضافه کردن پیام های چاپی به اسکریپت
- نظر دادن انتخابی کد
- استفاده از دیباگر پایتون
این بخش هر یک از این رویکردها را با جزئیات بیشتری بررسی می کند. به خاطر داشته باشید که در اکثر مواقع، اشکال زدایی به شما نمی گوید که چرا یک اسکریپت به درستی اجرا نمی شود، اما به شما می گوید که کجا – یعنی در کدام خط کد شکست خورده است. به طور معمول، شما هنوز هم باید بفهمید که چرا خطا رخ داده است.
بررسی دقیق محتوای پیام های خطا
پیام های خطای تولید شده توسط ArcPy معمولاً آموزنده هستند. به مثال زیر توجه کنید:
واردات کمان
arcpy.env.workspace = “C:/Data”
infcs = [“streams.shp”, “floodzone.shp”]
outfc = “union.shp”
arcpy.Union_analysis(infcs, outfc)
این اسکریپت یک اتحاد بین دو کلاس ویژگی ورودی انجام می دهد که به عنوان یک لیست وارد می شوند. نتیجه باید یک کلاس ویژگی خروجی جدید در همان فضای کاری باشد. پیام خطا به شرح زیر است:
ExecuteError: اجرا نشد. پارامترها معتبر نیستند
ERROR 000366: نوع هندسه نامعتبر است
اجرا نشد (Union).
به این پیغام خطای خاص که توسط ArcPy تولید میشود، anExecuteErrorاستثنا. پیام مفید است زیرا شامل متن استنوع هندسه نامعتبر است. بررسی دقیقتر کلاسهای ویژگی ورودی نشان میدهد که یکی از ورودیها (streams.shp) یک کلاس ویژگی چند خطی است و ابزار Union فقط با ویژگیهای چند ضلعی کار میکند. بنابراین، پیغام خطا دقیقاً به شما نمی گوید که چه چیزی اشتباه است (یعنی نمی گوید streams.shp از نوع هندسی polyline است و ابزار Union این نوع هندسی را نمی پذیرد)، اما شما را در جهت درست
هنگامی که یک کد خطای خاص در پیام خطا گنجانده شده است، مانند ERROR 000366، می توانید در راهنمای ArcGIS Pro درباره آن اطلاعات بیشتری کسب کنید. میتوانید با وارد کردن کد خطا یعنی «000366» معنای پیام خطا را جستجو کنید.
شرح
کد خطا شامل توضیحی است که می گوید نوع هندسه نامعتبر است و راه حلی برای بررسی اینکه کدام نوع هندسه برای عملیات پشتیبانی می شود و باید به عنوان ورودی استفاده شود.
همه پیام های خطا به این اندازه مفید نیستند. اسکریپت زیر را در نظر بگیرید:
واردات کمان
arcpy.env.workspace = “C:/mydata”
infcs = [“streams.shp”, “floodzone.shp”]
outfc = “union.shp”
arcpy.Union_analysis(infcs, outfc)
این اسکریپت مانند قبل است، اما از یک فضای کاری متفاوت (C:\mydata) استفاده می کند که وجود ندارد. پیام خطا در IDLE به شرح زیر است:
ردیابی (آخرین تماس اخیر):
فایل “C:\Data\myunion.py”، خط 5، در <module>
arcpy.Union_analysis(infcs, outfc)
فایل “C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\analysis.py” خط 737، در Union
بالا بردن e
فایل “C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\analysis.py” خط 734 در Union
retval = convertArcObjectToPythonObject(gp.Union_analysis(*gp_fixargs((in_features, out_feature_class, join_attributes, cluster_tolerance, gaps), True)))
فایل “C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\geoprocessing\_base.py”، خط 498، در <lambda>
برگردان لامبدا *args: val(*gp_fixargs(args، True))
arcgisscripting.ExecuteError: اجرا نشد. پارامترها معتبر نیستند
ERROR 000732: ویژگی های ورودی: جریان های مجموعه داده وجود ندارد یا پشتیبانی نمی شود
اجرا نشد (Union).
پیام خطا گمراه کننده است. به نظر می رسد نشان می دهد که خطا در خط 5 کد (جایی که اتحادیه انجام می شود) است و مشکلی در پارامترهای ابزار وجود دارد. خطا در واقع در خط 2 است، جایی که یک فضای کاری نامعتبر تعریف شده است، و پیام پارامتر نامعتبر از این واقعیت است که هیچ کلاس ویژگی از فضای کاری ناموجود بدست نمی آید. متأسفانه، توابع گزارش خطای داخلی همیشه پیام خطای خاص تری مانند «فضای کاری وجود ندارد» را گزارش نمی کنند.
بررسی دقیق پیام های خطا مفید است زیرا ممکن است پاسخی برای رفع مشکل داشته باشند. اما کورکورانه به آنها خیره نشوید زیرا ممکن است خطا چیز کاملاً متفاوتی باشد و پیام های خطا ممکن است گمراه کننده باشند.
اضافه کردن پیام های چاپی به اسکریپت
وقتی چندین خط کد حاوی ابزارهای پردازش جغرافیایی دارید، ممکن است همیشه مشخص نباشد که در کدام خط خطا رخ داده است. در چنین مواردی، چاپ پیام ها پس از هر ابزار پردازش جغرافیایی یا سایر مراحل مهم برای تأیید اجرای موفقیت آمیز آنها ممکن است مفید باشد. کد زیر را در نظر بگیرید:
واردات کمان
arcpy.env.overwriteOutput = درست است
arcpy.env.workspace = “C:/Data”
arcpy.Buffer_analysis(“roads.shp”، “buffer.shp”، “1000 METERS”)
چاپ (“بافر تکمیل شد”)
arcpy.Erase_analysis(“buffer.shp”، “zone.shp”، “erase.shp”)
چاپ (“پاک کردن کامل شد”)
arcpy.Clip_analysis(“erase.shp”، “wetlands.shp”، “clip.shp”)
چاپ (“کلیپ تکمیل شد”)
اگر یک پیام خطا رخ دهد، پیام های چاپی نشان می دهد که کدام مراحل تکمیل شده اند، صرف نظر از اینکه پیام خطا تا چه حد مرموز است. به احتمال زیاد می توان این خطا را در بلوک کد درست قبل از پیام چاپی که اجرا نشد ردیابی کرد.
چاپ همچنین برای بررسی مقادیر متغیرها در اسکریپت شما استفاده می شود. مثالی از فصل 6 را در نظر بگیرید که در آن یک اسکریپت برای کپی کردن فایل های شکل موجود در یک فضای کاری در یک پایگاه داده جغرافیایی استفاده می شود:
واردات کمان
واردات سیستم عامل
arcpy.env.workspace = “C:/Transportation”
outgdb = “C:/Transportation/City.gdb”
fcs = arcpy.ListFeatureClasses()
برای fc در fcs:
desc = arcpy.da.Describe(fc)
outfc = os.path.join(outgdb, desc[“baseName”])
arcpy.CopyFeatures_management(fc، outfc)
اگر کلاسهای ویژگی خروجی ایجاد نشده باشند، اما اجرای اسکریپت هیچ خطای معنیداری ایجاد نکند، چه؟ مسیرها و نام فایل ها یک مشکل رایج هستند، بنابراین یکی از مواردی که می توانید امتحان کنید این است که مقادیر کلاس های ویژگی خروجی را به عنوان چک چاپ کنید. به طور معمول، بقیه اسکریپت را نظر می دهید تا فقط روی نام مسیر و فایل تمرکز کنید:
واردات کمان
واردات سیستم عامل
arcpy.env.workspace = “C:/Transportation”
outgdb = “C:/Transportation/City.gdb”
fcs = arcpy.ListFeatureClasses()
برای fc در fcs:
desc = arcpy.da.Describe(fc)
outfc = os.path.join(outgdb, desc[“baseName”])
چاپ (outfc)
##arcpy.CopyFeatures_management(fc, outfc)
پرینت چیزی شبیه به این خواهد بود:
C:/Transportation/City.gdb\arterials
C:/Transportation/City.gdb\bike_routes
ج:/Transportation/City.gdb\major_roads
چاپ به شما اجازه می دهد تا تأیید کنید که مقادیر مطابق انتظار هستند و می توانید تلاش خود را بر روی سایر مسائل احتمالی در مورد اسکریپت متمرکز کنید.
افزودن پیامهای چاپی میتواند مؤثر باشد، اما زمانی مفید هستند که از قبل ایده خوبی در مورد آنچه ممکن است باعث ایجاد خطا شده باشد، داشته باشید. یکی از معایب چاپ پیام ها این است که پس از رفع خطا باید پاک شوند، که می تواند کار قابل توجهی باشد.
نظر دادن انتخابی کد
نظر دادن انتخابی کد شامل حذف خطوط خاصی است تا ببینید آیا این خطا را از بین می برد یا خیر. فیلمنامه در بخش قبلی قبلاً نمونه ای از این رویکرد را نشان می داد. اگر اسکریپت شما یک گردش کار متوالی معمولی دارد، می توانید از پایین به بالا کار کنید. به عنوان مثال، کد زیر نشان می دهد که چگونه خطوط پایین کد با استفاده از علائم دو عددی (#) برای جداسازی خطا توضیح داده می شوند:
واردات کمان
arcpy.env.overwriteOutput = درست است
arcpy.env.workspace = “C:/Data”
arcpy.Buffer_analysis(“roads.shp”، “buffer.shp”، “1000 METERS”)
##arcpy.Erase_analysis(“buffer.shp”، “streams.shp”، “erase.shp”)
##arcpy.Clip_analysis(“erase.shp”، “wetlands.shp”، “clip.shp”)
میتوانید با دوبار تایپ علامت عددی در ابتدای یک خط کد، بهصورت دستی نظر دهید. IDE های پایتون همچنین دارای عملکرد داخلی برای این کار هستند، بنابراین می توانید چندین خط کد را در یک مرحله نظر دهید. به عنوان مثال، در IDLE، یک یا چند خط را برجسته کرده و روی Format > Uncomment Region کلیک کنید.
توجه داشته باشید:
قبل از نظرات در کد علامت عدد وجود دارد که به آن “علامت هش” نیز گفته می شود. هر خطی که با یک یا چند علامت # شروع شود اجرا نمی شود. یک علامت # منفرد معمولاً برای نظرات دائمی توسط نویسنده اسکریپت برای توضیح چیزی در مورد کد استفاده میشود، در حالی که نماد # دوتایی برای نظر دادن موقت خطوط کد در طول فرآیند آزمایش استفاده میشود.
مانند چاپ پیامها، نظر دادن خطوط کد دلیل رخ دادن خطا را مشخص نمیکند، بلکه فقط به شما کمک میکند تا جایی که رخ میدهد را جدا کنید.
استفاده از دیباگر پایتون
روش دیگر و سیستماتیک تر برای اشکال زدایی کد، استفاده از دیباگر پایتون است. دیباگر ابزاری است که به شما امکان می دهد خط به خط کد خود را طی کنید، نقاط شکست را در کد خود قرار دهید تا شرایط را در آن نقطه بررسی کنید و نحوه تغییر متغیرهای خاص را در سراسر کد خود دنبال کنید. پایتون یک بسته دیباگر داخلی به نام داردپی دی بی. استفاده از آن می تواند دشوار باشد زیرا فاقد رابط کاربری است و فقط از طریق خط فرمان قابل استفاده است. با این حال، ویرایشگرهای پایتون مانند IDLE، Spyder و PyCharm دارای یک محیط اشکال زدایی هستند که استفاده از آن آسان تر است. در مثال زیر از دیباگر IDLE استفاده شده است. این دیباگر عملکرد اولیه ای را ارائه می دهد که برای نشان دادن نحوه عملکرد اشکال زدایی کافی است.
یک روش اشکال زدایی معمولی به شرح زیر است:
- هر گونه خطای نحوی را بررسی کنید و اسکریپت را ذخیره کنید.
- نقاط شکست را تنظیم کنید، به شما امکان می دهد اجرای اسکریپت را در خطوط خاصی متوقف کنید.
- اسکریپت را با استفاده از دیباگر اجرا کنید.
- از طریق اسکریپت قدم بردارید و مراقب مقادیر متغیرهای مربوطه باشید.
اسکریپتی که قبلاً در این بخش استفاده شده بود در اینجا برای نشان دادن این مراحل استفاده می شود. ابتدا یک بررسی برای تعیین هر گونه مشکل نحوی اجرا می شود. پس از بررسی نحو، نقاط شکست در اسکریپت تنظیم می شود. اشکال زدایی از طریق خط به خط یک اسکریپت کار می کند، اما این فرآیند می تواند دست و پا گیر باشد. نقاط شکست به صورت دستی در نقاط خاصی از اسکریپت تنظیم می شوند. دیباگر تا رسیدن به نقطه شکست اجرا می شود. برای تنظیم نقاط شکست در یک اسکریپت در IDLE، مکان نما را در خط مورد نظر قرار دهید، کلیک راست کرده و روی تنظیم نقطه شکست کلیک کنید. خط با نقطه شکست زرد می شود. در اسکریپت مثال، نقاط شکست روی خطوط بابرایحلقه و با مسیر و نام فایل برای کلاس ویژگی خروجی.
شرح
پنجره اسکریپت در IDLE با همان کد در متن، با خطوط 6 و 8 که با رنگ زرد برجسته شده اند تا نقاط شکست را نشان دهند.
با تنظیم نقاط شکست، می توانید دیباگر را راه اندازی کنید. در IDLE، شما از پوسته پایتون (یا پنجره تعاملی) شروع می کنید، نه از پنجره اسکریپت. اگر پوسته پایتون قابل مشاهده نیست، از منوی بالا در پنجره اسکریپت، روی Run > Python Shell کلیک کنید. از منوی بالایی در Python Shell، روی Debug > Debugger کلیک کنید. در زیر فرمان، پیام [DEBUG ON] چاپ می شود.
در همان زمان، پنجره Debug Control باز می شود.
همه کنترل ها کم نور هستند، زیرا اسکریپت هنوز اجرا نشده است. برای شروع اشکال زدایی، به پنجره اسکریپت برگردید و اسکریپت را طبق معمول اجرا کنید. از آنجایی که شما آن را در حالت اشکال زدایی اجرا می کنید، تنها خط اول اسکریپت اجرا می شود. پنجره Debug Control باز می شود و شرایط بعد از اولین خط کد را نشان می دهد.
مراحل بعدی در فرآیند اشکال زدایی از پنجره Debug Control کنترل می شود. روی دکمه Go کلیک کنید تا اسکریپت تا اولین نقطه شکست اجرا شود. این مرحله شرایط متغیرهای آن خط در اسکریپت را نشان می دهد.
پنجره Debug Control مکان نقطه شکست (یعنی خط 6 در اسکریپت) را تأیید می کند و متغیرهای مهم را نشان می دهد. در این حالت مقدار متغیر fcs را به صورت زیر نشان می دهد:
[‘arterials.shp’، ‘bike_routes.shp’، ‘major_roads.shp’]
این نتیجه به سادگی تأیید می کند که به متغیر یک مقدار معنی دار اختصاص داده شده است – در این مورد، لیستی از رشته ها که به کلاس های ویژگی در فضای کاری اشاره می کنند. برای مشاهده تمام متغیرها می توانید در پانل پایین کادر محاوره ای اسکرول کنید. این لیست نه تنها شامل متغیرهایی است که در اسکریپت ایجاد کرده اید، بلکه مواردی مانند ماژول های خاص مورد استفاده و مسیرهای آنها را نیز شامل می شود.
دوباره روی Go کلیک کنید تا کد تا نقطه شکست بعدی اجرا شود. این بار متغیر fc اضافه می شود و حاوی مقدار اولین عنصر از لیست کلاس های ویژگی است. دوباره روی Go کلیک کنید و مسیر کامل کلاس ویژگی خروجی نشان داده می شود.
با هر مرحله ای که در ادامه می آید، مقادیر fc و outfc به عنصر بعدی در لیست به روز می شوند. به طور موثر، شما در حال گذر از آن هستیدبرایحلقه یک تکرار در یک زمان. این روش روشی مؤثر برای تأیید درستی کارکرد تکرار است.
پس از تکمیل تمام نقاط شکست، دیباگر متوقف می شود و گزینه های موجود در پنجره Debug Control دوباره کم نور می شوند.
چندین گزینه دیگر به عنوان بخشی از فرآیند اشکال زدایی در IDLE وجود دارد. ابزار Step به شما این امکان را می دهد که خط به خط اسکریپت را بدون پرش به نقاط شکست مشخص شده طی کنید. ابزارهای Over و Out به شما این امکان را می دهند که در صورت لزوم از جلو پرش کنید. برای مثال، اگر خط فعلی کد حاوی فراخوانی به یک ماژول، تابع یا متد دیگر باشد، استفاده از ابزار Step منجر به ورود به آن رویه میشود. با استفاده از ابزار Over، خط کد را بدون وارد شدن به آن رویه اجرا میکنید—شما در حال «گذر از» جزئیات آن رویه هستید. هنگامی که وارد یک رویه میشوید، میتوانید از ابزار Out برای خارج شدن از رویه استفاده کنید، بدون اینکه از بقیه خطوط کد عبور کنید. این ویژگی به شما این امکان را می دهد که سریع به جلو بروید و به خط بعدی کد که رویه نامیده می شود بازگردید. بطور کلی، قدم زدن خط به خط اسکریپت شما ضروری نیست و در واقع می تواند کدهایی را از ماژول های مورد استفاده که معمولاً نیازی به نگاه کردن به آنها نیست، بیاورد. بنابراین استفاده از نقاط شکست انتخابی به شدت توصیه می شود.
در نهایت، ابزار Quit اشکال زدایی اسکریپت فعلی را به پایان می رساند، اما حالت اشکال زدایی روشن باقی می ماند. برای توقف کامل اشکال زدایی، از منوی بالای پوسته پایتون، روی Debug کلیک کنید و تیک Debugger را بردارید. این مرحله [DEBUG OFF] را در زیر فرمان چاپ می کند.
روش های اشکال زدایی در Spyder و PyCharm به روشی مشابه کار می کنند، اگرچه عملکرد رابط کمی متفاوت است. در Spyder، منوی کشویی Debug از منوی اصلی گزینه هایی را برای تنظیم نقاط شکست به شما می دهد.
از همان منو، روی Debug کلیک کنید تا اشکال زدایی شروع شود، و روی Continue کلیک کنید تا به نقطه شکست بعدی بروید.
در طول اشکال زدایی، می توانید متغیرها و مقادیر آنها را در پنجره کاوشگر متغیر در سمت راست بالا مشاهده کنید. به جای استفاده از رابط کاربری گرافیکی برای اشکال زدایی، می توانید از دیباگر IPython نیز استفاده کنیدipdbدر کنسول پایتون
در PyCharm، میتوانید با کلیک کردن در کنار شماره خط، یعنی بین شماره خط و کد، نقاط شکست را اضافه کنید.
برای شروع اشکال زدایی، از منوی بالا روی Run > Debug کلیک کنید. این مرحله پنجره Debug Tool را در پانل پایین نمایش می دهد. این پنجره مجموعه کاملی از کنترل ها را برای اشکال زدایی، از جمله نوار ابزارها و پنجره های مختلف برای ردیابی متغیرها ارائه می دهد.
بررسی دقیق روش های اشکال زدایی با استفاده از Spyder و PyCharm خارج از محدوده این فصل است. PyCharm مخصوصاً شامل بسیاری از گزینههای مختلف برای اشکالزدایی میشود، و این موارد به تفصیل در مستندات آنلاین PyCharm توضیح داده شدهاند. اگرچه این ابزارها قدرتمند هستند، اما یادگیری این ابزارها زمان می برد. برای خودکارسازی وظایف پردازش جغرافیایی برای اسکریپتهای مستقل نسبتاً ساده، استفاده از بررسی نحو و ابزارهای Inspect Code در PyCharm اغلب کافی است.
7.5استفاده از نکات و ترفندهای رفع اشکال
در زیر چند نکته و ترفند کلی برای کمک به اشکال زدایی اسکریپت های خود آورده شده است:
- به یاد داشته باشید که ArcGIS Pro اغلب یک قفل را روی یک فایل قرار می دهد، که ممکن است مانع از بازنویسی فایل توسط یک اسکریپت شود. اگر ArcGIS Pro را برای بازبینی نتایج خود باز دارید، ممکن است لازم باشد برنامه ArcGIS Pro را ببندید تا قفل ها آزاد شوند.
- هنگام کار با فایل های حجیم، ابتدا کد خود را روی یک فایل کوچک با ویژگی های مشابه امتحان کنید.
- برای تکرار در لیست های طولانی، اضافه کردن شمارنده برای پردازش فقط تعداد کمی از عناصر را در نظر بگیرید تا مطمئن شوید که کد قبل از پردازش کل لیست به درستی کار می کند.
- با درج پیام های چاپی یا تعیین نقاط شکست در کد به عنوان بخشی از یک روش رسمی اشکال زدایی، مراقب نحوه تغییر مقادیر متغیرها باشید.
- نقاط انفصال را در داخل بلوک های کد قرار دهید که باید تکرار شود.
- اگر ویرایشگر پایتون شما در حین دیباگ کردن متوقف نشد، می توانید کد را با استفاده از Ctrl + C روی صفحه کلید خود قطع کنید. برخی از ویرایشگرهای پایتون، از جمله Spyder و PyCharm، یک دکمه Stop واقعی دارند.
7.6رسیدگی به خطا برای استثناها
اگرچه روشهای اشکال زدایی میتواند به نوشتن کد صحیح کمک کند، خطاهای استثنا همچنان در اسکریپتهای شما رخ میدهد. استثناها به خطاهایی اشاره دارند که در حین اجرای اسکریپت شناسایی می شوند. یکی از دلایل کلیدی برای استثناها این است که بسیاری از اسکریپت ها به ورودی های کاربر متکی هستند و شما همیشه نمی توانید ورودی های ارائه شده توسط سایر کاربران را کنترل کنید. بنابراین، اسکریپتهای خوب نوشته شده شامل رویههای رسیدگی به خطا برای رسیدگی به استثناها هستند. رویه های رسیدگی به خطا برای جلوگیری از شکست اسکریپت و عدم ارائه بازخورد معنی دار نوشته شده اند.
برای رسیدگی به استثناها، می توانید از عبارات شرطی برای بررسی سناریوهای خاص استفاده کنیداگربیانیه. شما قبلاً در فصل های قبلی با برخی از آنها روبرو شده اید. به عنوان مثال، وجود یک مسیر را می توان در پایتون با استفاده از یک تابع داخلی پایتون مانندos.path.exists(). برای مسیرهای کاتالوگ می توانید ازوجود دارد()تابع ArcPy برای تعیین اینکه آیا مجموعه داده وجود دارد یا خیر. به عنوان مثال، کد زیر تعیین می کند که آیا یک شکل فایل وجود دارد یا خیر:
واردات کمان
arcpy.env.workspace = “C:/Data”
shape_exists = arcpy.Exists(“streams.shp”)
چاپ (شکل_وجود دارد)
دروجود دارد()تابع را می توان برای کلاس های ویژگی، جداول، مجموعه داده ها، شکل فایل ها، فضاهای کاری، لایه ها و فایل های موجود در فضای کاری فعلی استفاده کرد. تابع یک مقدار بولی برمی گرداند که نشان می دهد آیا عنصر وجود دارد یا خیر.
علاوه بر تعیین اینکه آیا داده وجود دارد یا خیر، میتوانید با استفاده از این نوع دادهها را تعیین کنیدتوصیف کردن()وda.Describe()توابع ArcPy به عنوان مثال، اگر اسکریپت شما به یک کلاس ویژگی نیاز دارد، می توانید از آن استفاده کنیدنوع دادهویژگی برای تعیین اینکه آیا یک کلاس ویژگی است یا چیز دیگری.
نوشتن عبارات شرطی برای بسیاری از خطاهای احتمالی خسته کننده است. و پیش بینی هر خطایی غیرممکن است. در کد مثال قبلی در این بخش، باید موارد زیر را بررسی کنید: (1) آیا فضای کاری معتبر است، (2) آیا حداقل یک کلاس ویژگی در فضای کاری وجود دارد، و (3) آیا یک ویژگی وجود دارد یا خیر. کلاس با حداقل یک ویژگی این بررسی ها به راحتی می توانند کد موجود در اسکریپت را دو برابر کنند.
دو استراتژی برای بررسی خطاها و گزارش آنها به شیوه ای معنی دار وجود دارد:
- از اشیاء استثنای پایتون در داخل استفاده کنیدسعی کنید-به جزبیانیه.
- پیام ها را با استفاده از عملکردهای پیام رسانی ArcPy گزارش دهید.
یک جایگزین قدرتمند برای دستورات شرطی، استفاده از اشیاء استثنای پایتون است. وقتی پایتون با خطایی مواجه میشود، یک استثنا ایجاد میکند یا یک استثنا ایجاد میکند، که معمولاً به این معنی است که اسکریپت اجرا نمیشود. اگر چنین شی استثنایی مدیریت نشود، که به آن catch یا trapped نیز گفته می شود، اسکریپت با یک خطای زمان اجرا خاتمه می یابد، که گاهی اوقات به عنوان یک ردیابی نامیده می شود.
مثال ساده تلاش برای تقسیم بر صفر را در نظر بگیرید. در پنجره پایتون، همانطور که در شکل نشان داده شده است، یک خطای زمان اجرا ایجاد می شود.
بخشهای زیر نشان میدهد که چگونه استثناها مطرح میشوند و چگونه این مواردسعی کنید-به جزبیانیه به طور موثر خطاها را به دام می اندازد.
7.7بالا بردن استثناها
همانطور که در مثالهای بخشهای قبلی نشان داده شده است، هنگامی که هنگام اجرای یک اسکریپت مشکلی پیش بیاید، استثناها بهطور خودکار مطرح میشوند. شما همچنین می توانید استثناهایی را با استفاده از آن مطرح کنیدبالا بردنبیانیه. به عنوان مثال، شما می توانید یک استثنا عمومی با استفاده ازبالا بردن استثنابیانیه به شرح زیر
بالا بردن استثنا
نتیجه این عبارت چیزی شبیه به زیر است:
ردیابی (آخرین تماس اخیر):
فایل “<string>”، خط 1، در <module>
استثنا
توجه داشته باشید:در مثال های زیر،ردیابیبخشی از پیام خطا حذف می شود و فقط آخرین خط نشان داده می شود.
همچنین می توانید یک پیام خاص به شرح زیر اضافه کنید:
افزایش استثنا (“فضای کاری نامعتبر”)
نتیجه این بیانیه:
استثنا: فضای کاری نامعتبر
انواع مختلفی از استثناها وجود دارد. شما می توانید آنها را با وارد کردن مشاهده کنیدساخته شدهماژول و با استفاده ازdir()تابع فهرست کردن همه آنها به شرح زیر است:
توده های وارداتی
dir (ساختمان ها)
اجرای این کد منجر به چاپ طولانی می شود (در اینجا به طور کامل نشان داده نشده است):
[‘ArithmeticError’، ‘AssertionError’، ‘AttributeError’، ‘BaseException’، ‘BlockingIOError’، ‘BrokenPipeError’، ‘BufferError’، ‘BytesWarning’ …]
توجه داشته باشید که این کد سایر عناصر را نیز چاپ می کندساخته شدهماژول، شامل تمام توابع داخلی و ثابت است، اما استثناها ابتدا چاپ می شوند.
هر یک از این استثناها را می توان دربالا بردنبیانیه. مثلا:
افزایش ValueError
نتیجه این بیانیه:
ValueError
این مثال یک استثنا با نام است – یعنی استثنا خاص با نام خوانده می شود. استثناهای نامگذاری شده به یک اسکریپت اجازه می دهد تا استثناهای خاص را به روش های مختلف مدیریت کند، که می تواند مفید باشد. با استفاده از عمومیاستثنابه عنوان یک استثنای بی نام شناخته می شود.
شرح کاملی از استثناهای داخلی پایتون را می توان در اسناد پایتون یافت. در مستندات، به مرجع کتابخانه بروید و بخش «استثناهای داخلی» را مرور کنید. اسناد همچنین سلسله مراتبی از خطاها را نشان می دهد: به عنوان مثال،ZeroDivisionErrorیکی از چندین نوع خطای حسابی است (خطای حسابی).
7.8رسیدگی به استثنائات
استثناها در یک اسکریپت را می توان با استفاده از a کنترل کرد – یعنی گرفتار یا به دام افتادسعی کنید-به جزبیانیه. هنگامی که یک استثنا به درستی مدیریت می شود، اسکریپت یک خطای زمان اجرا ایجاد نمی کند، بلکه پیام خطای معنی داری را به کاربر گزارش می دهد. اسکریپت تمام می شود و در صورت بروز خطا، پیام های اطلاعاتی را گزارش می دهد.
اسکریپت زیر را در نظر بگیرید که دو عدد ارائه شده توسط کاربر را تقسیم می کند:
x = ورودی (“عدد صحیح اول:”)
y = ورودی (“عدد صحیح دوم:”)
چاپ (int(x)/int(y))
اسکریپت تا زمانی که صفر (0) به عنوان عدد دوم وارد شود، به خوبی کار می کند و در نتیجه پیام خطای زیر را ایجاد می کند:
ZeroDivisionError: تقسیم بر صفر
درسعی کنید-به جزدستور این استثنا را به دام می اندازد و مدیریت خطای اضافی را به شرح زیر ارائه می دهد:
تلاش كردن:
x = ورودی (“عدد صحیح اول:”)
y = ورودی (“عدد صحیح دوم:”)
چاپ (int(x)/int(y))
به جز ZeroDivisionError:
print (“عدد صحیح دوم نمی تواند صفر باشد.”)
به ساختار آن توجه کنیدسعی کنید-به جزبیانیه. خط اول کد فقط از کد تشکیل شده استتلاش كردنبیانیه و به دنبال آن دو نقطه. بعد یک بلوک از کد تورفتگی با رویه ای است که می خواهید انجام دهید. سپس می آیدجزعبارت، که شامل یک استثنا خاص و به دنبال آن یک دو نقطه است. بعد یک بلوک از کد تورفتگی است که اگر استثنای خاص مطرح شود، اجرا می شود. استثناZeroDivisionErrorیک استثنا با نام است، به این معنی که داخلی است.
در این مثال یک سادهاگراین عبارت ممکن است به همان اندازه برای تعیین اینکه آیا مقدار y صفر است (0) موثر بوده است. با این حال، برای کد دقیق تر، ممکن است به بسیاری از این کدها نیاز داشته باشیداگربیانیه ها و تکسعی کنید-به جزبیانیه برای به دام انداختن خطا کافی است.
چندگانهجزعبارات می توانند استثناهای نامگذاری شده مختلف را بگیرند. مثلا:
تلاش كردن:
x = ورودی (“عدد صحیح اول:”)
y = ورودی (“عدد صحیح دوم:”)
چاپ (int(x)/int(y))
به جز ZeroDivisionError:
print (“عدد صحیح دوم نمی تواند صفر باشد.”)
به جز ValueError:
print (“فقط اعداد صحیح ورودی های معتبر هستند.”)
شما همچنین می توانید چندین استثنا را با یک بلوک کد با مشخص کردن آنها به صورت یک تاپل به صورت زیر بدست آورید:
به جز (ZeroDivisionError، ValueError):
چاپ (“نوشته های شما معتبر نبودند.”)
در این حالت رسیدگی به خطا مختص نوع استثنا نیست و صرف نظر از اینکه کدام یک از این دو خطا باعث استثنا شده است فقط یک پیام چاپ می شود. پیام خطا، در این مورد، کمتر خاص است زیرا چندین استثنا را توصیف می کند. اگرچه ترکیب استثناها به این روش کد شما را کوتاهتر میکند، معمولاً استثناهای خاصتری ترجیح داده میشوند.
خود شیء استثنا نیز می تواند با ارائه یک آرگومان اضافی فراخوانی شود:
به جز (ZeroDivisionError، ValueError) به عنوان e:
چاپ (ه)
اجرای این کد به شما این امکان را می دهد که خود شی استثنا را بگیرید و می توانید به جای چاپ یک پیام خطای سفارشی، آن را چاپ کنید تا ببینید چه اتفاقی افتاده است.
گاهی اوقات پیش بینی همه انواع استثناهایی که ممکن است رخ دهد دشوار است. به خصوص در اسکریپتی که به ورودی کاربر متکی است، ممکن است نتوانید تمام سناریوهای ممکن را پیش بینی کنید. بنابراین، برای گرفتن همه استثناها، صرف نظر از نوع، می توانید به سادگی استثنای خاص را حذف کنیدجزبیانیه به شرح زیر
تلاش كردن:
x = ورودی (“عدد صحیح اول:”)
y = ورودی (“عدد صحیح دوم:”)
چاپ (int(x)/int(y))
به جز استثنا به عنوان e:
چاپ (ه)
در این مثال، استثنا بدون نام است.
ممکن است تعجب کنید که این تفاوت با عدم استفاده ساده از aسعی کنید-به جزبیانیه و اجازه رخ دادن خطا، و در نتیجه یک پیام خطا. تفاوت اصلی این است که وقتی از aسعی کنید-به جزبیانیه، اسکریپت به طور معمول ادامه می یابد و به پایان می رسد. اگر خطا به دام نیفتد، اسکریپت در اواسط فرآیند متوقف می شود. بنابراین، با یکسعی کنید-به جزهر کدی که از آن پیروی می کند، بدون توجه به خطا، همچنان اجرا می شود، در حالی که خطایی که به دام نیفتد منجر به خاتمه اسکریپت قبل از اجرای آن قسمت از کد می شود. بنابراین، به دام انداختن خطاها منجر به اسکریپت های قوی تر و کاربر پسندتر می شود.
درسعی کنید-به جزبیانیه همچنین می تواند شامل یکدیگربیانیه که مانند یک عبارت شرطی است. مثلا:
در حالی که درست است:
تلاش كردن:
x = ورودی (“عدد صحیح اول:”)
y = ورودی (“عدد صحیح دوم:”)
چاپ (int(x)/int(y))
جز:
چاپ (“لطفا دوباره امتحان کنید.”)
دیگر:
زنگ تفريح
در این مثال،تلاش كردنبلوک کد در یک تکرار می شوددر حالی کهحلقه زمانی که یک استثنا مطرح می شود. حلقه توسطزنگ تفريحبیانیه دردیگرمسدود کردن فقط زمانی که هیچ استثنایی مطرح نشده باشد. اگر کاربر مقادیر نامعتبری مانند یک رشته، یک شناور یا مقدار 0 را برای ورودی دوم وارد کند، اسکریپت خطایی ایجاد نمی کند اما از کاربر می خواهد دوباره امتحان کند. اسکریپت تنها زمانی نتیجه را چاپ می کند که ورودی های معتبر ارائه شود.
یک اضافه دیگر بهسعی کنید-به جزبیانیه استسرانجامبیانیه. نتیجه قبلی هر چه باشدتلاش كردن،جز، یادیگربلوک های کد،سرانجامبلوک کد همیشه اجرا می شود. این بلوک معمولاً شامل وظایف پاکسازی است و میتواند شامل بررسی مجوزها یا حذف ارجاع به فایلها باشد.
به جای استفاده از یکی از استثناهای نامگذاری شده موجود، می توانید استثناهای خود را نیز ایجاد کنید. کد مثال زیر را در نظر بگیرید که در آن از کاربر خواسته میشود یک رمز عبور جدید ارائه دهد و اسکریپت بررسی میکند که آیا ورودی حداقل شش کاراکتر داشته باشد یا خیر:
تلاش كردن:
رمز عبور = ورودی (“یک رمز عبور جدید وارد کنید:”)
اگر لنز (رمز عبور) > 5:
print (“رمز عبور شما به اندازه کافی طولانی است.”)
دیگر:
افزایش ValueError
به جز ValueError:
print (“رمز عبور شما خیلی کوتاه است.”)
استثنای نام برده شدهValueErrorدر اینجا استفاده می شود، اما بررسی های مشابه دیگری نیز وجود دارد که می توان انجام داد، از جمله کاراکترهای مجاز، استفاده از حروف بزرگ و کوچک، استفاده از ترکیبی از حروف و اعداد و غیره. هر یک از این خطاها نیز یک خواهد بودValueErrorاستثنا. بنابراین وجود یک استثنا خاص برای مواردی که رمز عبور خیلی کوتاه است مفید خواهد بود. این را می توان با استفاده از یک استثنا سفارشی انجام داد. این شامل ایجاد یک کلاس سفارشی با استفاده ازکلاسکلمه کلیدی به شرح زیر است:
کلاس TooShortError (ValueError):
عبور
استثنای سفارشی یک نام داده می شود و بر اساس موجود استValueErrorاستثنا.
توجه داشته باشید:از کلاس های سفارشی می توان برای ایجاد بسیاری از اشیاء مختلف، نه فقط استثنا، استفاده کرد.
برای ایجاد یک کلاس جدید از کلمه کلیدی استفاده می شودکلاس، به دنبال آن نام کلاس و هر آرگومان وجود دارد. خط کد با دونقطه به پایان می رسد و بلوک کدی که در ادامه می آید شامل کارهایی است که کلاس انجام می دهد. زیرا در این حالت، استثنا فقط باید وجود داشته باشد و نیازی به انجام کار دیگری نیست، هیچ کدی لازم نیست. با این حال، یک کولون همیشه باید با یک بلوک کد دنبال شود، و بنابراین حداقل یک خط کد مورد نیاز است که هیچ کاری انجام نمی دهد. این خط کد با استفاده ازعبورکلمه کلیدی، به معنی “هیچ کدی برای اجرا در اینجا وجود ندارد.”
اکنون کل فیلمنامه به شرح زیر است:
کلاس TooShortError (ValueError):
عبور
تلاش كردن:
رمز عبور = ورودی (“یک رمز عبور جدید وارد کنید:”)
اگر لنز (رمز عبور) > 5:
print (“رمز عبور شما به اندازه کافی طولانی است.”)
دیگر:
TooShortError را افزایش دهید
به جز TooShortError:
print (“رمز عبور شما خیلی کوتاه است.”)
ایجاد کلاس سفارشی در بالای اسکریپت است زیرا هر کلاسی باید قبل از استفاده تعریف شود. بقیه اسکریپت همان است، اما استثنای نامگذاری شده استValueErrorبا استثنای سفارشی جایگزین می شودTooShortError. استفاده از کلاس های استثنای سفارشی درک کد شما را آسان تر می کند.
7.9رسیدگی به استثنائات ژئوپردازش
تا کنون، استثنائات مطرح شده کاملاً کلی هستند. یک اسکریپت پایتون، البته، می تواند به دلایل زیادی که به طور خاص به یک ابزار پردازش جغرافیایی مربوط نمی شود، شکست بخورد، همانطور که نمونه های قبلی نشان می دهد. با این حال، از آنجایی که خطاهای مربوط به ابزارهای پردازش جغرافیایی تا حدودی ماهیت منحصر به فرد دارند، توجه بیشتری را ایجاب می کنند.
شما می توانید خطاها را به دو دسته تقسیم کنید: خطاهای پردازش جغرافیایی و هر چیز دیگری. هنگامی که یک ابزار geoprocessing یک پیام خطا می نویسد، ArcPy یک خطای سیستم ایجاد می کند. به طور خاص، هنگامی که یک ابزار ژئوپردازش با شکست مواجه می شود، آن را پرتاب می کندExecuteErrorاستثنا، که می تواند برای رسیدگی به خطاهای خاص ژئوپردازش استفاده شود. این یکی از کلاس های استثنای داخلی پایتون نیست، اما توسط ArcPy تولید می شود و بنابراینarcpy.ExecuteErrorکلاس باید استفاده شود
این مثال را در نظر بگیرید:
واردات کمان
arcpy.env.workspace = “C:/Data”
in_features = “streams.shp”
out_features = “streams.shp”
تلاش كردن:
arcpy.CopyFeatures_management(in_features, out_features)
به جز arcpy.ExecuteError:
print(arcpy.GetMessages(2))
جز:
print (“خطای غیر ابزاری وجود دارد.”)
ابزار Copy Features یک خطا ایجاد می کند زیرا کلاس های ویژگی ورودی و خروجی نمی توانند یکسان باشند، به شرح زیر:
اجرا نشد. پارامترها معتبر نیستند
ERROR 000725: کلاس ویژگی خروجی: مجموعه داده C:/Data\streams.shp از قبل وجود دارد.
اجرا نشد (CopyFeatures).
در کد مثال، اولینجزدستور هر گونه خطای پردازش جغرافیایی را به دام می اندازد و دومجزدستور هر گونه خطای دیگری که به پردازش جغرافیایی مربوط نمی شود را به دام می اندازد. این مثال نشان میدهد که چگونه میتوان از استثناهای نامدار و بدون نام در یک اسکریپت استفاده کرد. مهم است که ابتدا استثناهای نامگذاری شده را بررسی کنید، مانندبه جز arcpy.ExecuteError، و سپس استثناهای بی نام. اگر ابتدا استثناهای بدون نام بررسی شوند، عبارت تمام استثناها، از جمله هر موردی را می گیردarcpy.ExecuteErrorاستثناها. شما هرگز نمی دانید که آیا یک استثناء نامگذاری شده (که در اسکریپت قرار داده اید) رخ داده است یا خیر.
در اسکریپت های بزرگتر، تعیین محل دقیق یک خطا می تواند دشوار باشد. می توانید از پایتون استفاده کنیدردیابیماژول برای جداسازی مکان و علت یک خطا.
درردیابیساختار به شرح زیر است:
واردات کمان
سیستم واردات
ردیابی واردات
تلاش كردن:
<block of code از جمله ابزارهای geoprocessing>
جز:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = (“خطاهای پایتون:\nاطلاعات ردیابی:\n” + tbinfo +
“\nاطلاعات خطا:\n” + str(sys.exc info() [1]))
msgs = “خطاهای ArcPy:\n” + arcpy.GetMessages(2) + “\n”
arcpy.AddError(pymsg)
arcpy.AddError(پیام)
چاپ (pymsg)
چاپ (پیام)
در این کد، دو نوع خطا به دام افتاده است: خطاهای پردازش جغرافیایی و همه انواع دیگر خطاها. خطاهای ژئوپردازش با استفاده ازarcpy.GetMessages()عملکرد. خطاها برای استفاده در ابزار اسکریپت با استفاده برگردانده می شوندarcpy.AddError()و همچنین با استفاده از خروجی استاندارد پایتون چاپ می شودچاپ(). همه انواع دیگر خطاها با استفاده از بازیابی می شوندردیابیمدول. مقداری قالب بندی اعمال می شود و خطاها برای استفاده در ابزار اسکریپت برگردانده می شوند و در خروجی استاندارد پایتون چاپ می شوند.
در زیر یک مثال دیگر از الف آورده شده استسعی کنید-به جزبیانیه با استفاده ازسرانجامبیانیه. در این مثال، یک کلاس استثنای سفارشی برای رسیدگی به یک خطای مجوز ایجاد می شود. یک مجوز در بررسی می شودتلاش كردنبلوک کد، و مجوز به عنوان بخشی از بررسی می شودسرانجامبلوک کد این مراحل تضمین میکنند که مجوز بررسی میشود، بدون توجه به نتیجه اجرای بلوکهای کد قبلی، به شرح زیر:
خطای مجوز کلاس (استثنا):
عبور
واردات کمان
تلاش كردن:
if arcpy.CheckExtension(“3D”) == “در دسترس”:
arcpy.CheckOutExtension (“3D”)
دیگر:
افزایش خطای مجوز
arcpy.env.workspace = “C:/Raster”
arcpy.Slope_3d(“ارتفاع”، “شیب”)
به جز LicenseError:
چاپ (“مجوز سه بعدی در دسترس نیست”)
جز:
print(arcpy.GetMessages(2))
سرانجام:
arcpy.CheckInExtension (“3D”)
به طور کلیExecuteErrorکلاس استثنا مفید است، و برخی از اسکریپت ها به ساده اما موثر متکی هستندسعی کنید-به جزبیانیه بدون استفاده از هیچ کلاس استثنای اضافی. با این حال، بهتر است از بررسی خطاهای صریح تر، از جمله استثناهای سفارشی مانند: استفاده کنیدخطای مجوزاستثنا در مثال قبلی
با استفاده ازسعی کنید-به جزعبارت برای به دام انداختن خطا رایج است. گاهی اوقات، کل اسکریپت را می بینید که در a پیچیده شده استسعی کنید-به جزبیانیه. به نظر می رسد چیزی شبیه به زیر است، که در آنتلاش كردنبلوک کد می تواند شامل صدها خط کد باشد:
واردات کمان
سیستم واردات
ردیابی واردات
تلاش كردن:
## چندین خط کد در اینجا
جز:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = (“خطاهای پایتون:\nاطلاعات ردیابی:\n” + tbinfo +
“\nاطلاعات خطا:\n” + str(sys.exc_info()[1]))
msgs = “خطاهای ArcPy:\n” + arcpy.GetMessages(2) + “\n”
arcpy.AddError(pymsg)
arcpy.AddError(پیام)
این رویکرد برای مدیریت خطا یک ساختار نسبتاً رایج برای اسکریپت های پیچیده است و به طور گسترده در این شکل یا کمی تغییر یافته استفاده می شود.
7.10استفاده از روش های دیگر رسیدگی به خطا
علاوه بر الفسعی کنید-به جزبیانیه ای برای به دام انداختن خطاها در اسکریپت ها، می توان از چندین روش دیگر رسیدگی به خطا استفاده کرد. برخی از آنها در فصل های دیگر پوشش داده شده است، اما لازم است در اینجا بیشتر ذکر شود:
- اعتبار سنجی نام جدول و فیلدها با استفاده ازValidateTableName()وarcpy.ValidateFieldName()توابع، به ترتیب.
- بررسی مجوز برای محصولات با استفاده ازCheckProduct()تابع و برای برنامه های افزودنی با استفاده ازarcpy.CheckExtension()عملکرد.
- بررسی قفلهای داده – اگر قفلهای داده در ورودی وجود داشته باشد، بسیاری از ابزارهای پردازش جغرافیایی به درستی اجرا نمیشوند.
7.11مراقب خطاهای رایج
در زیر چندین خطای رایج وجود دارد که باید هنگام اسکن اسکریپت ها و بررسی داده های خود به آنها توجه کنید.
خطاهای رایج کد پایتون
- اشتباهات املایی ساده
- فراموش کردن وارد کردن ماژول ها، مانندقوسییاسیستم عامل
- حساسیت به حروف کوچک – برای مثال،لیست مندر مقابللیست من
- مسیرها — برای مثال، با استفاده از یک اسلش (\)، مانند C:\Data\newstreams.shp
- فراموش کردن دو نقطه بعد از عبارات (برای،در حالی که،دیگر،تلاش كردن،جز)
- تورفتگی نادرست یا ناسازگار
- عبارات شرطی (==) در مقابل انتساب (=).
خطاهای رایج مربوط به ژئوپردازش
- فراموش کردن تعیین اینکه آیا داده وجود دارد یا خیر. یک اشتباه تایپی کوچک در نام یک فضای کاری یا کلاس ویژگی باعث از کار افتادن یک اسکریپت می شود. همیشه دوبار بررسی کنید که ورودی های یک اسکریپت وجود داشته باشد.
- فراموش کردن بررسی خروجی رونویسی. تنظیم پیشفرض بازنویسی خروجیها نیست، بنابراین تا زمانی که بازنویسی به طور خاص مجاز نباشد، اسکریپتی که تلاش میکند فایلهای موجود را بازنویسی کند اجرا نمیشود. یک سناریوی رایج این است که یک اسکریپت را اجرا کنید و آن را اجرا کنید (حداقل تا حدی)، اما وقتی برای بار دوم آن را اجرا میکنید، شکست میخورد زیرا نتیجه اجرای اول در حال بازنویسی است. رفع این مشکل می تواند به سادگی تنظیم باشدرونویسی خروجیدارایی ازenvکلاس بهدرست است، واقعی.
- داده ها در برنامه دیگری استفاده می شوند. ممکن است سعی کنید یک اسکریپت را اجرا کنید، اما اجرا نمی شود زیرا شما همچنین از داده ها در ArcGIS Pro استفاده می کنید. این سناریو متداول است زیرا اغلب شما در حال بررسی داده هایی هستید که در اسکریپت استفاده می شود. بستن ArcGIS Pro و امتحان مجدد اسکریپت ممکن است یک خطای اسکریپت را برطرف کند.
- بررسی نکردن خصوصیات پارامترها و اشیاء برگردانده شده توسط ابزارها. برای مثال، ممکن است منطقی به نظر برسد که ابزار Get Count یک شمارش تولید کند، یعنی یک عدد. اما در عوض، a را برمی گرداندنتیجهشی که در پنجره Results چاپ می شود، بنابراین باید از آن استفاده کنیدgetOutput()روش بدست آوردن عدد به طور مشابه، تمایز بین کلاسهای ویژگی و لایههای ویژگی ممکن است تا حدی بیاهمیت به نظر برسد، اما آنها میتوانند تنها تفاوت بین اجرای صحیح اسکریپت و شکست باشند. سینتکس اسکریپت را به دقت بررسی کنید و ماهیت دقیق ورودی ها و خروجی ها را تعیین کنید.
شایان ذکر است که هنگام استفاده از ابزارهای اسکریپت یا جعبه ابزار پایتون می توان از بسیاری از خطاهای مربوط به ژئوپردازش جلوگیری کرد. اعتبار سنجی برای جلوگیری از پارامترهای نامعتبر در این ابزار گنجانده شده است.
برخی از این پیشنهادات ممکن است ابتدایی به نظر برسند، اما راهحلها اغلب میتوانند ساده باشند اگر فقط بدانید کجا به دنبال آنها بگردید. سینتکس یک اسکریپت پایتون خوب می تواند نسبتا ساده باشد، که بخشی از زیبایی استفاده از پایتون است.
توجه داشته باشید:به یاد داشته باشید که اسکریپتهای پردازش جغرافیایی نه تنها باید از منطق کدنویسی پایتون پیروی کنند، بلکه باید از قوانین چارچوب ژئوپردازش ArcGIS Pro نیز تبعیت کنند.
نکاتی که باید به خاطر بسپارید
- خطاها در اسکریپت های پردازش جغرافیایی حتماً اتفاق می افتد. این خطاها شامل خطاهای نحوی، استثناها و خطاهای منطقی است. یکی از مزایای IDE های پایتون مانند Spyder و PyCharm این است که چک کردن نحو تعاملی و سایر ویژگی های بررسی کد را ارائه می دهند که باعث می شود هنگام نوشتن کد خود تصحیح مسائل را آسان تر کنید. اگرچه خطاهای نحوی نسبتاً آسان به دست میآیند، اسکریپت شما ممکن است حاوی انواع دیگری از خطاها باشد که از اجرای صحیح اسکریپت جلوگیری میکند. اسکریپت ها را می توان با ترکیب رویه های رسیدگی به خطا قوی تر کرد.
- روش های مختلف اشکال زدایی وجود دارد. رویکردهای نسبتاً ساده شامل بررسی دقیق پیامهای خطا، افزودن پیامهای چاپی به کد برای بررسی نتایج میانی و اظهار نظر انتخابی کد است. اگر این روش ها برای شناسایی و رفع خطاها کافی نباشد، می توان از یک دیباگر پایتون استفاده کرد. یک دیباگر به شما اجازه می دهد تا با دقت از طریق کد، خط به خط، پیغام های خطا را بررسی کرده و وضعیت متغیرها را بررسی کنید. نقاط شکست اغلب به جای ارزیابی خط به خط یک اسکریپت برای عبور از بلوک های بزرگتر کد استفاده می شود. روش های خاص اشکال زدایی بسته به IDE مورد استفاده تا حدودی متفاوت است.
- یک روش اشکال زدایی معمولاً محل وقوع خطا را مشخص می کند اما دقیقاً دلیل رخ دادن آن را مشخص نمی کند. بنابراین، تمرین خوب است که همیشه از خطاهای رایج، از جمله خطاهای کدگذاری پایتون و خطاهای پردازش جغرافیایی ArcGIS Pro آگاه باشید.
- روشهای اصلی رسیدگی به خطا شامل بررسی وجود دادهها، تعیین اینکه آیا ورودی دادهها نوع مناسبی هستند، بررسی مجوزها و برنامههای افزودنی، و اعتبارسنجی نام جدول و فیلد است. به طور معمول، یکاگردستور برای این نوع رسیدگی به خطا استفاده می شود.
- پیشبینی هر نوع خطا تقریباً غیرممکن است، و کدی که بررسی چنین خطاهایی برای نوشتن بسیار دشوار است. هر زمان که مشکلی در یک اسکریپت پیش بیاید، یک استثنا به طور خودکار مطرح می شود. این استثناها را می توان با استفاده از a به دام انداختسعی کنید-به جزبیانیه. این نوع دستور تشخیص نوع خطا را ممکن می سازد. رویه های سفارشی رسیدگی به خطا را می توان بر اساس خطا اجرا کرد. اظهارات اضافی، از جملهدیگروسرانجام، می توان به آن اضافه کردسعی کنید-به جزبیانیه برای اطمینان از به دام انداختن کارآمد خطا.
- استثناهای داخلی شامل موارد کلی استاستثناکلاس و همچنین بسیاری از استثناهای نامگذاری شده دیگر. شما همچنین می توانید استثناهای سفارشی خود را ایجاد کنید، که اسکریپت های شما را قوی تر و قابل درک تر می کند.
- پیام های خطا می توانند برای شناسایی ماهیت خطا و نحوه رفع اسکریپت مفید باشند. اینها هم پیامهای عمومی پایتون و هم پیامهای خطای ناشی از آن را شامل میشوندExecuteErrorکلاس استثنا
شرایط کلیدی
- نقطه شکست
- نظر دادن کد
- کلاس سفارشی
- استثنای سفارشی
- اشکال زدا
- اشکال زدایی
- رسیدگی به خطا
- استثنا
- شی استثنا
- تورفتگی
- خطای منطقی
- به نام استثنا
- فاصله گذاری
- خطای نوشتاری کد
- ردیابی
- استثنا بی نام
سوالات را مرور کنید
- نمونه هایی از برخی از رایج ترین خطاهای نحوی را ارائه دهید.
- استثناها چیست؟ چگونه مدیریت استثناها منجر به اسکریپت های قوی تر می شود؟
- برخی از روش های معمول اشکال زدایی را شرح دهید.
- مراحل استفاده از دیباگر پایتون را توضیح دهید.
- کاربرد آن را توضیح دهیدسعی کنید-به جزبیانیه برای رسیدگی به استثناها.
- توضیح دهید که چگونه استفاده از استثناهای سفارشی می تواند کد شما را قوی تر کند.
بدون دیدگاه