این آموزش مدیریت استثنا در پایتون را با استفاده از بلوک Try Ex با کمک مثالهای برنامهنویسی توضیح میدهد:
دو نوع خطا ممکن است باعث توقف ناگهانی برنامه پایتون شوند، به عنوان مثال Syntax خطاها و استثناها . در این آموزش، نوع خطای دوم (Exceptions) را تحت چندین موضوع مهم مورد بحث قرار خواهیم داد.
ما از مدیریت استثناها در برنامه خود سود زیادی خواهیم برد، مانند:
- ایجاد یک برنامه کاربردی قوی.
- ایجاد یک کد تمیز و بدون خطا.
Python Try Except
یک خبر خوب این است که پایتون تعداد زیادی استثناء داخلی برای تشخیص خطاها در کد ما دارد. همچنین، این فرصت را به ما می دهد تا زمانی که هیچ یک از استثناهای داخلی مطابق با نیازهای ما نباشد، استثناهای سفارشی ایجاد کنیم.
استثنا چیست
پس استثنا در پایتون چیست؟ خوب، به زبان ساده، هر زمان که مفسر پایتون سعی می کند کد نامعتبر را اجرا کند، یک استثنا ایجاد می کند و در مواردی که چنین استثنایی مدیریت نمی شود، جریان عادی دستورالعمل های برنامه را مختل می کند و یک ردیابی چاپ می کند.
بیایید یک کد نامعتبر ایجاد کنیم و ببینیم مفسر پایتون چگونه پاسخ خواهد داد.
یک پوسته پایتون را باز کنید و کد زیر را اجرا کنید.
>>> 50/0
این یکی از رایج ترین خطاها در برنامه نویسی کد بالا سعی می کند عدد 50 را بر 0 (صفر) تقسیم کند. پایتونمتغیر openFile قبل از اینکه اختصاص داده شود.
یک ترفند کوچک در اینجا استفاده از کنترل کننده های استثنا در داخل بلوک نهایی است.
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: try: print("Cleaning...") openFile.close() except: # catches all exceptions pass # Ignore this error because we don't care. if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
اگر try-block ما FileNotFoundError را افزایش دهد، خروجی زیر را خواهیم داشت
Raise Exception
یک خبر خوب در مورد استثناهای پایتون این است که می توانیم عمداً آنها را بزرگ کنید استثناها با عبارت raise مطرح می شوند.
عبارت raise دارای نحو زیر است:
raise [ExceptionName[(*args: Object)]]
یک ترمینال را باز کنید و هر شی استثنایی را از آن بالا ببرید. استثناهای ساخته شده پایتون. به عنوان مثال، اگر ZeroDivisionError را افزایش دهیم:
>>> raise ZeroDivisionError("Can't divide by zero")
ما ردیابی را دریافت خواهیم کرد:
بنابراین، چرا مطرح کردن استثناها مهم است؟
- هنگام کار با استثناهای سفارشی.
- در طول بررسی های سلامت عقل.
کلاس های استثنای سفارشی
یک استثنای سفارشی، استثنایی است که برای رسیدگی به خطاهایی که مختص نیاز شما هستند ایجاد میکنید. ترفند این است که ما کلاسی را تعریف می کنیم که از شی Exception مشتق می شود، سپس از دستور raise برای بالا بردن کلاس استثنای خود استفاده می کنیم.
فرض کنید می خواهیم ورودی کاربر را بررسی کنیم و مطمئن شویم مقدار ورودی منفی نیست (بررسی سلامت عقل). البته، ما میتوانیم ValueError استثنای پایتون را افزایش دهیم، اما میخواهیم خطا را با دادن یک نام خاص و خود توضیحی مانند InputIsNegativeError سفارشی کنیم. اما این استثنا یک پایتون داخلی نیستException.
بنابراین ابتدا کلاس پایه خود را ایجاد می کنیم که از Exception مشتق می شود.
class CustomError(Exception): "Base class exception for all exceptions of this module" pass
سپس کلاس استثنای خود را ایجاد می کنیم که کلاس پایه را به ارث می برد و خطای خاص ما را مدیریت می کند.
class InputIsNegativeError(CustomError): """Raised when User enters a negative value""" pass
بیایید این
try: value = int(input()) if value 0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print("Input value shouldn't be negative")
درخواست کد بالا را برای ورودی کاربر آزمایش کنیم و بررسی کنیم که آیا منفی است. اگر درست باشد، InputIsNegativeError استثنای سفارشی ما را افزایش میدهد که بعداً در عبارت استثنا قرار میگیرد.
کد کامل در زیر آمده است:
class CustomError(Exception): "Base class exception for all exceptions of this module" pass class InputIsNegativeError(CustomError): """Raised when User enters a negative value""" pass if __name__ == '__main__': try: value = int(input("Input a number: ")) if value 0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print("Input value shouldn't be negative")
If مقدار ورودی یک عدد منفی مانند -1 است، سپس خروجی را خواهیم داشت:
برای جزئیات بیشتر در مورد استثناهای سفارشی پایتون، سند پایتون را بررسی کنید.
سوالات متداول
سؤال شماره 1) Python چگونه یک استثنا را مدیریت می کند؟
پاسخ: Python استثناها را با استفاده از مدیریت می کند عبارت try-except . کدی که میتواند یک استثنا ایجاد کند در block try قرار میگیرد و اجرا میشود در حالی که except block کدی را نگه میدارد که در صورت بروز استثنا، آن را مدیریت میکند.
. 1>سؤال 2) ایجاد استثنا در پایتون چیست؟
پاسخ: هر زمان که مفسر پایتون با کد نامعتبر مواجه شد، یک استثنا ایجاد می کند که روش خود پایتون است. به ما بگوید که اتفاقی غیرمنتظره افتاده است. همچنین میتوانیم عمداً استثناها را با استفاده از عبارت raise افزایش دهیم.
Q #3) Python چگونه چندین استثنا را مدیریت میکند؟
پاسخ: پایتون چندین استثنا را کنترل می کندبا استفاده از یک بلوک به جز یا چند بلوک به جز.
برای یک بلوک واحد، استثناها به صورت یک تاپل ارسال می شوند: به جز (Exception1, Exception2,..,ExceptionN) و چک های Python برای مسابقه از راست به چپ در این مورد، برای هر استثنا یک اقدام انجام میشود.
یک راه دیگر برای گرفتن همه استثناها این است که نام استثنا را بعد از کلمه کلیدی استثنا حذف کنید.
except: # handle all exceptions here
روش دوم این است که برای استفاده از یک بلوک استثنا برای هر استثنا:
except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here
به این ترتیب، می توانید اقدامات جداگانه ای برای هر Exception انجام دهید.
سؤال #4) چرا مدیریت Exception در پایتون مهم است؟
پاسخ: مزیت مدیریت استثناها در پایتون این است که میتوانیم برنامههای قوی، تمیز و بدون خطا ایجاد کنیم. ما نمی خواهیم کد تولید ما به دلیل برخی خطاها خراب شود، بنابراین خطاها را مدیریت می کنیم و برنامه خود را فعال نگه می داریم.
Q #5) چگونه یک استثنا را در پایتون نادیده می گیریم؟
پاسخ: برای نادیده گرفتن یک استثنا در پایتون، از کلمه کلیدی pass در بلوک استثنا استفاده کنید. فرض کنید می خواهیم استثنا ValueError را نادیده بگیریم. ما این کار را به این صورت انجام خواهیم داد:
except ValueError: pass
مگر اینکه ندانید چه کاری انجام می دهید، نادیده گرفتن استثناها تمرین بدی است. حداقل، کاربر را در مورد تمام خطاهای احتمالی آگاه کنید.
نتیجه گیری
در این آموزش، موارد زیر را پوشش دادیم: Python Exceptions, Traceback; نحوه رسیدگی به استثناها با امتحان / به جز / دیگر / در نهایت بلوکها، نحوه افزایش استثناها و در نهایت نحوه ایجاد استثناهای سفارشی خودمان.
از خواندن متشکریم!
مفسر این را به عنوان یک عملیات نامعتبر می بیند و ZeroDivisionErrorرا ایجاد می کند، برنامه را مختل می کند و یک ردیابی چاپ می کند.
ما به وضوح می بینیم که ZeroDivisionError استثنایی است که مطرح شد. در واقع این روش خود پایتون است که به ما می گوید تقسیم یک عدد بر صفر کار جالبی نیست. اگرچه در زبان های دیگر مانند جاوا اسکریپت، این یک خطا نیست. و پایتون اکیداً این عمل را ممنوع میکند.
همچنین، مهم است که بدانید این فقط یک شی استثنا است و پایتون بسیاری از این اشیاء را در خود دارد. این مستندات رسمی پایتون را بررسی کنید تا تمام استثناهای داخلی پایتون را ببینید.
درک Traceback
قبل از اینکه به بررسی استثناها بپردازیم، فکر می کنم به درک اینکه در صورت استثناها دقیقاً چه اتفاقی می افتد کمک خواهد کرد. مدیریت نمی شوند و Python چگونه تمام تلاش خود را می کند تا ما را در مورد خطای ما مطلع کند.
هرگاه پایتون با خطا مواجه شود، یک استثنا ایجاد می کند. اگر این استثنا رسیدگی نشود، اطلاعاتی به نام Traceback تولید می کند. بنابراین، این ردیابی شامل چه اطلاعاتی است؟
این شامل:
- پیام خطایی است که به ما می گوید چه استثنایی مطرح شده است و چه اتفاقی قبل از این استثنا افتاده است. raised.
- شماره خطوط مختلف کد که باعث این خطا شده است. یک خطا ممکن است ناشی از دنباله ای از فراخوانی های تابع به نام پشته تماس باشد که بعداً در اینجا به آن خواهیم پرداخت.
هر چند این یککمی گیجکننده است، قول میدهیم که مثال بعدی به درک ما روشنتر خواهد شد.
ردیابی را که از تقسیم 50 بر 0 در بالا چاپ شد را به خاطر بیاورید، میتوانیم ببینیم که ردیابی حاوی اطلاعات زیر است:
- فایل "": این به ما می گوید که این کد از ترمینال کنسول اجرا شده است.
- خط 1: این به ما می گوید که خطا در این شماره خط رخ داده است.
- Error ZeroDivision: تقسیم بر صفر: به ما می گوید که چه استثنایی مطرح شده و چه چیزی باعث آن شده است.
بیایید مثال دیگری را امتحان کنیم و شاید ببینید پشته تماس چگونه به نظر می رسد. یک ویرایشگر را باز کنید، کد زیر را وارد کنید و به عنوان tracebackExp .py
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 compute = numb/div # 6 print(compute) # 7 if __name__ == '__main__': # 9 numb = 5 # 10 stack1(numb) # 11
ترمینال را در فهرستی که این فایل پیدا شده است باز کنید و اجرا کنید.
python tracebackExp.py
ردیابی زیر را مشاهده خواهید کرد:
ردیابی فوق ممکن است گیج کننده به نظر برسد، اما واقعاً اینطور نیست. Pythonistas بهترین راه را برای خواندن ردیابی پیدا کرد که از پایین به بالا است. بنابراین، بیایید از این خرد استفاده کنیم تا تلاش کنیم و بفهمیم که این ردیابی چه چیزی را ارائه می دهد.
- در نهایت، استثنایی را که مطرح شد و چرایی آن مطرح شد، دریافت می کنیم.
- > با حرکت به سمت بالا، نام فایل tracebackExp .py را دریافت می کنیم که در آن این خطا رخ داده است، محاسباتی که باعث این خطا شده است compute = numb/div، تابع stack2، و شماره پیوند خط 6 که این محاسبه در آن انجام شده است. .
- با حرکت به سمت بالا، می بینیم که stack2 ما عمل می کنددر تابع stack1 در خط شماره 3 فراخوانی شد.
- با حرکت به بالاترین، می بینیم که تابع stack1 در خط شماره 11 فراخوانی شده است. module > به ما می گوید که این فایلی است که در حال اجرا است.
استثناهای رایج پایتون
کتابخانه پایتون تعداد بسیار زیادی استثناهای داخلی را تعریف می کند. میتوانید مستندات پایتون را بررسی کنید یا تابع داخلی local () را به صورت زیر فراخوانی کنید:
>>> dir(locals()['__builtins__'])
ما سعی نمیکنیم به همه این استثناها رسیدگی کنیم، اما چند استثنای رایج را خواهیم دید. که احتمالاً با آن مواجه خواهید شد.
#1) TypeError
زمانی که یک عملیات یا تابع بر روی یک شی از نوع نامناسب اعمال می شود، افزایش می یابد.
مثال 1
برنامه زیر را در نظر بگیرید. یک تقسیمکننده و مقسومکننده را میگیرد، سپس نتیجه تقسیم سود تقسیمکننده بر تقسیمکننده را محاسبه و چاپ میکند.
def compute_division(): dividend = int(input("Enter the dividend: ")) # cast string to int divisor = input("Enter the divisor: ") # no casting # Compute division result = dividend/divisor # print result print("The result of {}/{} is: {}".format(dividend, divisor, result)) if __name__ == '__main__': result = compute_division()
ما مقدار سود و مقسومکننده را از کاربر درخواست میکنیم، اما فراموش میکنیم که رشته تقسیمکننده را ریخته کنیم. مقدار به یک عدد صحیح تبدیل شود بنابراین، در نهایت نوع تقسیمکننده عدد صحیح ( int ) و نوع تقسیمکننده رشته ( str ) است. سپس TypeError را دریافت می کنیم زیرا عملگر تقسیم (/) روی رشته ها عمل نمی کند.
ممکن است برای شما جالب باشد که بدانید برخلاف پایتون، جاوا اسکریپت دارای Type Coercion است که اساساً یکی از انواع عملوند را به مقداری معادل از نوع عملوند دیگر تبدیل می کند، زمانی که عملوندها از نوع عملوند هستند.انواع مختلف.
#2) ValueError
این زمانی افزایش مییابد که یک عملیات یا تابع آرگومانی دریافت کند که نوع مناسبی دارد اما مقدار نامناسبی دارد.
مثال 2
برنامه ما را در مثال 1 بالا در نظر بگیرید.
اگر کاربر یک مقدار الفبایی برای سود سهام مانند '3a' وارد کند، برنامه ما افزایش می یابد استثنا ValueError. این به این دلیل است که، اگرچه متد Python int() هر عدد یا رشته ای را می گیرد و یک شی عدد صحیح را برمی گرداند، مقدار رشته نباید دارای حروف یا مقدار غیر عددی باشد.
#3) AttributeError
این استثنا هنگام تخصیص یا ارجاع مشخصه ای که وجود ندارد مطرح می شود.
مثال 3
برنامه را در نظر بگیرید زیر عددی را می گیرد و جذر آن را با استفاده از ماژول ریاضی پایتون محاسبه می کند
import math # import math library to gain access to its code def compute_square_root(number): # compute the square root using the math library result = math.sqr(number) return result if __name__ == '__main__': # get input to compute from user number = int(input("Compute Square root of: ")) # call function to compute square root
هنگامی که کاربر عددی را وارد می کند، برنامه ما سعی می کند از تابعی از ماژول ریاضی برای محاسبه جذر آن استفاده کند اما در اینجا، ما خطا کردیم به جای sqrt، ما به اشتباه sqr را تایپ کردیم که در ماژول ریاضی وجود ندارد.
بنابراین، ما سعی داشتیم به ویژگی sqr که وجود ندارد ارجاع دهیم و led به استثنا AttributeError در حال افزایش است. اکثر ما این نوع اشتباهات را زیاد مرتکب می شویم. بنابراین، شما تنها نیستید.
مدیریت استثناها با Try Except
به عنوان یک برنامه نویس، چیزی که بیشتر ما وقت خود را صرف آن می کنیم نوشتن یک کد قوی است کهارتجاعی. کدی که به دلیل برخی خطاها خراب نمی شود. در پایتون، میتوانیم با محصور کردن دستورات خود در داخل یک عبارت try – except به این هدف برسیم.
Python Try-Except
دستور try-except ساختار زیر را دارد:
try: #your code goes here except """Specify exception type(s) here""": #handle exception here
بیایید کد را در tracebackExp .py در داخل دستور try-except قرار دهیم.
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 try: # 6 compute = numb/div # 7 print(compute) # 8 except ZeroDivisionError as zde: # 9 print(zde) # 10 if __name__ == '__main__': # 12 numb = 5 # 13 stack1(numb) # 14 print("program continuous") # 15
اجرای این کد خروجی را تولید می کند
دستور try-except به این صورت کار می کند. پایتون کد را در بلوک try خط 7-8 اجرا می کند. اگر کد نامعتبری یافت نشد، کد موجود در بلوک بجز خط 10 نادیده گرفته میشود و اجرا ادامه مییابد.
اما اگر کد نامعتبری یافت شود، اجرا بلافاصله در قسمت متوقف میشود. سعی کنید بلاک کنید و بررسی کنید که آیا استثنا مطرح شده با چیزی که در دستور استثنا ارائه کرده ایم مطابقت دارد خط 9 . اگر مطابقت داشت، بلوک جز اجرا می شود و ادامه می یابد. اگر اینطور نشد، برنامه قطع میشود.
block try-block معمولاً حاوی کدی است که ممکن است یک استثنا ایجاد کند در حالی که بلاک استثنا آن استثنا را میگیرد و مدیریت میکند.
Handling Multiple استثناها با Except
ما میتوانیم چندین استثنا را با یک «به استثنای» یا چند «به استثنای» مدیریت کنیم. همه چیز به نحوه مدیریت هر استثنا بستگی دارد.
#1) مدیریت چندین استثنا با یک استثنا
try: #your code goes here except(Exception1[, Exception2[,...ExceptionN]]]): #handle exception here
این روش زمانی استفاده میشود که ما مشکوک باشیم که کد ما ممکن استاستثناهای مختلف را مطرح می کنیم و ما می خواهیم در هر مورد یک اقدام را انجام دهیم. بنابراین، اگر مفسر پایتون مطابقت پیدا کند، کد نوشته شده در بلوک استثنا اجرا خواهد شد.
بیایید مثال کد پایتون را در زیر در نظر بگیریم
def get_fraction(value, idx): arr = [4,5,2,0] # a list of numbers idx_value = arr[idx] # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 3 # call function in a try-except statement. try: result = get_fraction(value, idx) print("Fraction is ", result) except (IndexError, ZeroDivisionError) as ex: print(ex)
ما دو کد داریم. استثناهای احتمالی که می توانند در اینجا مطرح شوند، ZeroDivisionError و IndexError . اگر هر یک از این استثناها افزایش یابد، بلوک استثنا اجرا می شود.
در کد بالا، idx=3، بنابراین idx_ value 0 و value می شود. /idx_ value ZeroDivisionError را افزایش می دهد
#2) مدیریت چندین استثنا با چند استثنا
try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here
اگر ما ترجیح می دهیم مدیریت کنیم هر استثنا را به طور جداگانه انجام دهید، سپس به این صورت می توانید آن را انجام دهید.
مثال کد پایتون را در زیر در نظر بگیرید
def get_fraction(value, idx): arr = [4,5,2,0] # a list of numbers idx_value = arr[idx] # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 5 # call function in a try-excepts statement. try: result = get_fraction(value, idx) print("Fraction is ", result) except IndexError: print("idx of {} is out of range".format(idx)) except ZeroDivisionError: print("arr[{}] is 0. Hence, can't divide by zero".format(idx)) except Exception as ex: print(ex) print("Not sure what happened so not safe to continue, \ app will be interrupted") raise ex
ما در اینجا متوجه می شویم که Exception در آخرین دستور استثنا استفاده شده است. . این به این دلیل است که شیء استثنا Exception با هر استثنا مطابقت دارد. به همین دلیل، همیشه باید آخرین باشد، زیرا پایتون پس از تطبیق، دیگر کنترل کننده های استثنا را بررسی نمی کند.
در کد بالا، idx=5 ، بنابراین arr[idx ] IndexError را افزایش می دهد زیرا idx بزرگتر از طول لیست است arr
همچنین، مطمئن نیستید که چه استثنایی توسط برنامه شما ایجاد شده است، هرگز برای ادامه اجرا امن نیست. به همین دلیل است که ما از نوع Exception برای گرفتن هرگونه استثنای پیش بینی نشده داریم. سپس به اطلاع می رسانیمکاربر و برنامه را با بالا بردن همان استثنا قطع کنید.
عبارت Else را امتحان کنید
این یک ویژگی اختیاری مدیریت استثنا است و به شما امکان می دهد کدی را که می خواهید اضافه کنید زمانی که هیچ خطایی رخ نداد اجرا کنید. اگر خطایی رخ دهد، این بلوک else اجرا نخواهد شد.
مثال کد پایتون زیر را در نظر بگیرید، ویرایشگر خود را باز کنید و کد را به عنوان elseTry.py ذخیره کنید
def fraction_of_one(divisor): value = 1/divisor # if divisor is zero, ZeroDivisionError will be raised return value if __name__ == '__main__': while True: try: # Get input from the user. # if input is not a valid argument for int(), ValueError will be raised divisor = int(input("Enter a divisor: ")) # call our function to compute the fraction value = fraction_of_one(divisor) except (ValueError, ZeroDivisionError): print("Input can't be zero and should be a valid literal for int(). Please, try again!") else: print("Value: ", value) break
ما ورودی از کاربر دریافت می کنیم و از آن برای تقسیم 1 استفاده می کنیم. ما در اینجا دو استثنا داریم، یک ورودی نامعتبر کاربر که باعث ValueError می شود و یک zero(0) که باعث می شود Error ZeroDivision . دستور استثنای ما این خطاها را کنترل می کند.
اکنون، می خواهیم مقدار value را چاپ کنیم. بلاک else ما فقط در صورتی چاپ می شود که بلوک try ما بدون خطا اجرا شود. این مهم است زیرا اگر خطایی در بلوک try ما رخ دهد، مقدار تعریف نشده خواهد بود. بنابراین، دسترسی به آن خطای دیگری ایجاد می کند.
کد بالا را با Python otherTry.py اجرا کنید
خروجی بالا نشان می دهد که برای اولین ورودی، 0 را تایپ کرده و ENTER را فشار دادیم. از آنجایی که مقسومکننده ما 0 دریافت کرد، 1/divisor zeroDivisionError را افزایش داد. ورودی دوم ما k بود که برای int (() نامعتبر است، بنابراین استثنا ValueError افزایش مییابد.
اما آخرین ورودی ما 9 بود که معتبر است و به عنوان یک در نتیجه، مقدار " value " را دریافت کردیم که به صورت 0.1111111111111111 چاپ شده است
در نهایت سعی کنیدبیانیه
این نیز یک ویژگی اختیاری مدیریت استثناها است و همیشه بدون توجه به اتفاقاتی که در کنترلکنندههای استثنا رخ میدهد اجرا میشود.
یعنی:
- اینکه آیا یک استثنا رخ می دهد یا نه
- حتی اگر "بازگشت" در بلوک های دیگر فراخوانی شود.
- حتی اگر اسکریپت در بلوک های دیگر خارج شود
بنابراین، اگر کدی داریم که میخواهیم آن را در همه موقعیتها اجرا کنیم، در نهایت بلاک کردن، پسر ماست. این بلوک بیشتر برای پاکسازیهایی مانند بستن فایلها استفاده میشود.
مثال کد پایتون زیر را در نظر بگیرید
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: print("Cleaning...") openFile.close() if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
این کد سعی میکند فایل text.txt را باز کرده و بخواند. در فهرست فعلی خود اگر فایل وجود داشته باشد، برنامه ما اولین خط فایل را چاپ میکند، سپس بلوک نهایی ما اجرا میشود و فایل را میبندد.
مثلاً یک فایل به نام text.txt در دایرکتوری داریم که این برنامه در آن فایل است. است و شامل سلام است. اگر برنامه را اجرا کنیم، خروجی خواهیم داشت
این مثال عمداً انتخاب شده است زیرا میخواستم مشکل کوچکی را که ممکن است هنگام بستن فایلها در نهایت رخ دهد برطرف کنیم. مسدود کنید.
اگر فایل وجود نداشته باشد، استثنا FileNotFoundError ایجاد می شود و متغیر openFile تعریف نمی شود و یک فایل نخواهد بود. هدف - شی. بنابراین، تلاش برای بستن آن در بلوک نهایی، یک استثنا را ایجاد میکند UnboundLocalError که زیر کلاس NameError است.
این اساساً میگوید که ما میخواهیم ارجاع دهیم. را