در آموزش قبلی برنامه نویسی پایتون چیاب متوجه شدید که هنگام باز کردن یک فایل ممکن است اتفاقات غیرمنتظرهای بیوفتد و به عنوان مثال فایل باز نشود، زبان پایتون دو امکان برای مدیریت کردن ارورهای غیرمنتظره در نظر گرفته است که در این پست حالتهای مختلف آن را بررسی خواهیم کرد.
- Exception handling
- Assertions
Exception handling
در پایتون استثنا یا همان exception به رخدادی میگویند که در هنگام اجرای برنامه رخ دهد و باعث منحرف شدن جریان برنامه شود و اگر مدیریت نشود منجر به از کار افتادن برنامه میشود.
برای مدیریت کردن استثناها در زبان برنامه نویسی پایتون از ساختاری به نام try استفاده میشود؛ که ساختار آن به شکل زیر است.
try: You do your operations here; ...................... except ExceptionI: If there is ExceptionI, then execute this block. except ExceptionII: If there is ExceptionII, then execute this block. ...................... else: If there is no exception then execute this block.
در قسمتی که مربوط به try است، دستوراتی که قصد انجام دادن آنها را دارید و ممکن است ارور غیره منتظرهای طی اجرای آن دستورات رخ دهد، قراردهید.
در قسمت except ابتدا نوع ارور غیرمنتظره را مشخص کنید و پس از : دستوراتی که مایل هستید را بنویسید.
میتوانید از یک و یا چند except استفاده کنید.
دستوراتی که در قسمت else نوشته میشود، در حالتی اجرا میشوند که هیچ کدام از try و یا except ها اجرا نشوند.
به مثال ذیل و نتیجهی حاصل از آن توجه کنید.
try: fh = open("testfile", "w") fh.write("This is cheyab.ir test file for exception handling!!") except IOError: print ("Error: can\'t find file or read data") else: print ("Written content in the file successfully") fh.close()
ساختار try-except میتواند به صورت زیر نیز استفاده شود ولی این مدل آن به برنامهنویسهای حرفهای توصیه نمیشود زیرا مشخص نمیشود که کدام اتفاق غیرمنتظره رخ دادهاست و مانع از اجرای درست برنامه شده است.
try: You do your operations here; ...................... except: If there is any exception, then execute this block. ...................... else: If there is no exception then execute this block.
ساختار زیر نیز میتواند کاربردهای متفاوتی داشته باشد.
try: You do your operations here; ...................... except(Exception1[, Exception2[,...ExceptionN]]]): If there is any exception from the given exception list, then execute this block. ...................... else: If there is no exception then execute this block.
در ساختار زیر دستوراتی که بعد از finally قرارمیگیرد، دستوراتی است که چه try اجرا شود چه except ؛ همیشه و درهرحال اجرا میشوند.
try: You do your operations here; ...................... Due to any exception, this may be skipped. finally: This would always be executed. ......................
مثال زیر نمونهای از دو try تودرتو است.
try: fh = open("testfile", "w") try: fh.write("This is cheyab.ir test file for exception handling!!") finally: print ("Going to close the file") fh.close() except IOError: print ("Error: can\'t find file or read data")
راههای متنوعی برای استفاده از exceptionها وجود دارد، توجه کنید.
def functionName( level ): if level < 1: raise "Invalid level!", level # The code below to this would not be executed # if we raise the exception
برای اجرای اکسپشن بالا حتما باید از ساختار زیر استفاده کرد.
try: Business Logic here... except "Invalid level!": Exception handling here... else: Rest of the code here...
تاکنون تمام exceptionهایی که استفاده میکردیم توسط خود زبان برنامه نویسی پایتون تعریف شده بودند، اگر بخواهید یک exception ایجاد کنید، زبان پایتون به شما اجازه میدهد ولی باید آن را به صورت یک subclass از یکی از کلاسهای exceptionها در نظر بگیرید.
class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg
کلاس بالا به صورت یک subclass از کلاس RuntimeError در نظر گرفته شده است.میتوانید با استفاده از دستور raise، اکسپشنی را که تعریف کردهاید استفاده کنید.
try: raise Networkerror("Bad hostname") except Networkerror,e: print (e.args)
در ادامه جدولی از استثنائات برای شما قراردادهایم که میتوانید از آنها استفاده کنید.
قابل استفاده به صورت پایه برای تمام استثناها | Exception |
قابل استفاده برای زمانی که تابع next() در iteratorها به جایی اشاره نمیکند. | StopIteration |
با تابع sys.exit()، raise میشود. | SystemExit |
قابل استفاده برای تمام built in اکسپشنها غیر از SystemExit و StopIteration | StandardError |
قابل استفاده برای تمام ارورهایی که در محاسبات عددی پیش میآید. | ArithmeticError |
قابل استفاده برای زمانی که یک عدد از ماکزیمم محدودهای که برایش تعریف شده تجاوز کند. | OverflowError |
قابل استفاده برای زمانی که محاسبه floating point به مشکل برمیخورد. | FloatingPointError |
قابل استفاده برای زمانی که یک عدد بر صفر تقسیم شود. | ZeroDivisionError |
قابل استفاده برای زمانی که Assertion با شکست مواجه میشود. | AssertionError |
قابل استفاده برای زمانی که مرجع صفت دچار مشکل میشود. | AttributeError |
قابل استفاده برای زمانی که input()ورودی ندارد. | EOFError |
قابل استفاده برای زمانی که دستور import با شکست روبرو میشود. | ImportError |
قابل استفاده برای زمانی که کاربر سیستم را متوقف میکند، معمولا با فشار دادن ctrl+c | KeyboardInterrupt |
کلاس پایه برای ارورهای غیرمنتظرهی تمام جستجوها | LookupError |
قابل استفاده برای زمانی که indexدر سری وجود ندارد. | IndexError |
قابل استفاده برای زمانی که یک کلید خاص یافت نمیشود. | KeyError |
قابل استفاده برای زمانی که identifier در نامهای محلی و یا global یافت نمیشود. | NameError |
قابل استفاده برای زمانی که میخواهید به یک متغیر در یک تابع که به آن مقداری داده نشده دسترسی داشته باشید. | UnboundLocalError |
کلاس پایه برای تمام استثنائاتی که خارج از محدودهی پایتون رخ میدهند. | EnvironmentError |
قابل استفاده برای زمانی که ورودی و یا خروجی مشکل دارند، همچنین برای دستور open() نیز استفاده میشود. | IOError |
قابل استفاده برای زمانی که سینتکس ایراد دارد. | SyntaxError |
قابل استفاده برای زمانی که identation مشخص نشده باشد. | IndentationError |
قابل استفاده برای زمانی که interpretor یک مشکل داخلی دارد. | SystemError |
قابل استفاده برای زمانی که یک type نامعتبر استفاده شده است. | TypeError |
قابل استفاده برای زمانی که یک مقدار نامعتبر به عنوان آرگومان برای تابعی فرستاده میشود. | ValueError |
قابل استفاده برای زمانی که ارور تولید شده در هیچکدام از دستهها جای نگیرد. | RuntimeError |
قابل استفاده برای زمانی که نیاز است یک متد به صورت ارث بری شده اجرا شود و اجرا نشده است. | NotImplementedError |
Assertion
این دستور برای چک کردن است و معمولا در ابتدای توابع برای چک کردن ورودی و در انتهای توابع برای چک کردن خروجی استفاده میشود.اگر شرطی که در Assert آمده، برقرار باشد آنگاه دستورات بعدی اجرا میشود و اگر برقرار نباشد مانند exception عمل میکند.
مثال:
def KelvinToFahrenheit(Temperature): assert (Temperature >= 0),"Colder than absolute zero!" return ((Temperature-273)*1.8)+32 print (KelvinToFahrenheit(273)) print (int(KelvinToFahrenheit(505.78))) print (KelvinToFahrenheit(-5))
شما در انتهای این آموزش مهارت handle یا مدیریت کردن انواع ارورهای غیرمنتظره در زبان پایتون را کسب کردید.
در آموزش بعدی با مبحثی به نام تاریخ و زمان و نحوهی استفاده و کاربرد آن در پایتون آشنا خواهیدشد، با ما همراه باشید.
همچنین میتوانید نظرات، انتقادات،پیشنهادات و یا حتی سوالات خود را در قسمت نظرات با ما در میان بگذارید.
راستی! جهت مطلع شدن از آخرین اخبار و آموزش های ما میتوانید در کانال تلگرام چ یاب عضو شوید.
سلام
ممنون از مطلب مفید بالا
شما در زمینه کد نویسی پایتون مشاوره هم می دهید؟
سلام
متشکرم از توجه شما
خیر متاسفانه در حال حاضر چنین امکانی رو نداریم.
چند سوال در رابطه با خطاهای برنامه ای اجرا می کنم داشتم.
شما سوالاتتون رو همین جا مطرح کنید، اگر بنده تونستم پاسخ میدم حتما.
در غیر اینصورت هم دوستانی که به این صفحه میان و پرسش شما رو میبینن ممکنه جوابتون رو بدن.
کاربردی بود مرسی
امیدوارم این مطلب برای شما مفید باشد
و تشکر از توجه شما
خوشحالیم که مورد پسند واقع شده…
سایر مقالات مارو هم مطالعه کنید.