از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
مدیریت استثناء پایتون
سرفصلهای مطلب
معرفی
استثنا پایتون ساختاری است که برای سیگنال دادن به یک رویداد مهم، معمولاً یک خطا، که هنگام اجرای یک برنامه رخ می دهد، استفاده می شود. یک استثنا ممکن است باعث شود که برنامه به درستی “گرفته نشده” (یعنی به درستی مدیریت شود) متوقف شود. اگر فکر می کنید که برنامه شما ممکن است در هنگام اجرا یک استثنا ایجاد کند، استفاده از آن برای شما مفید خواهد بود try/except
برای رسیدگی به آنها، که در بخش بعدی خواهیم دید.
این راهنما به شما معرفی می کند که استثناهای پایتون چیست، رایج ترین انواع استثناها، و روش رسیدگی به استثناهای مطرح شده با
try
وexcept
بندها
رسیدگی به استثناها
در مثال زیر از کاربر می خواهیم عددی را وارد کند و پس از اجرا، برنامه مقدار عدد داده شده را مربع می دهد. این برنامه تا زمانی کار می کند که یک عدد را به عنوان ورودی خود وارد کنید:
while True:
x = int(raw_input("Please enter a number: "))
print("%s squared is %s" % (x, x**2))
هنگامی که یک رشته یا هر کاراکتر دیگری را وارد می کنید که عدد نیست، مانند “one”، برنامه یک علامت را افزایش می دهد “خطای مقدار” استثنا:
$ python squared.py
Please enter a number: 3
3 squared is 9
Please enter a number: 4
4 squared is 16
Please enter a number: five
Traceback (most recent call last):
File "squared.py", line 4, in <module>
x = int(raw_input("Please enter a number: "))
ValueError: invalid literal for int() with base 10: 'five'
اینجاست که کنترل استثناها وارد می شود. شما باید بدانید که چگونه استثناها را به درستی مدیریت کنید، به خصوص در محیط های تولید، زیرا اگر آنها را مدیریت نکنید، برنامه شما نمی داند چه کاری باید انجام دهد و از کار می افتد.
بیایید ببینیم چگونه می توانیم خطای بالا را مدیریت کنیم. این کار با احاطه کردن برنامه ای انجام می شود که فکر می کنید می تواند یک استثنا را با a ایجاد کند try
کلمه کلیدی و تطبیق آن با فالوور except
کلمه کلیدی برای اجرا در صورت بروز استثنا.
بیایید همان برنامه را بازنویسی کنیم، و این بار استثناهایی را که ممکن است پیش بیاید مراقبت می کند:
while True:
try:
x = int(raw_input("Please enter a number: "))
print("%s squared is %s" % (x, x**2))
except ValueError:
print("Please enter a valid number!")
همانطور که از برنامه بالا می بینید، کد داخل try
عبارت ابتدا اجرا می شود. اگر خطایی رخ ندهد، بقیه کد اجرا شده و except
بیانیه نادیده گرفته می شود
در صورتی که یک استثنا مطرح شود (مانند زمانی که یک رشته را به جای عدد وارد می کنیم)، برنامه برنامه را اجرا می کند. except
بیانیه ای که با آن مطابقت دارد try
عبارت، و به دنبال آن بقیه کد خارج از try/except
مسدود کردن، در صورت وجود.
ببینید وقتی کد خود را با کد اجرا می کنیم چه اتفاقی می افتد try/except
بیانیه:
$ python safe_squared.py
Please enter a number: 3
3 squared is 9
Please enter a number: 4
4 squared is 16
Please enter a number: five
Please enter a valid number!
Please enter a number: 5
5 squared is 25
توجه داشته باشید: لطفا در نظر داشته باشید که یک except
بند فقط استثنائات مربوط به خود را رسیدگی می کند try
بند، حتی اگر چند مورد وجود داشته باشد try/except
کنترل کننده بند
انواع استثناها در پایتون
پایتون چندین استثنا داخلی دارد. بیایید نگاهی به برخی از رایج ترین استثناها بیندازیم تا بتوانید دیدگاهی از چیستی آنها و روش استفاده از آنها داشته باشید.
استثناء KeyError
این خطایی است که هنگام استفاده از دیکشنری رخ می دهد و شما سعی می کنید کلیدی را که در فرهنگ لغت وجود ندارد بازیابی کنید.
در زیر یک نمای جنگو است که برای احراز هویت کاربران استفاده میشود و انتظار دارد دیکشنری حاوی کلیدهای “username” و “password” دریافت کند. اگر هر یک از کلیدها در داده ها ارسال نشود، برنامه یک استثنای Key Error ایجاد می کند.
def authenticate_user(request):
try:
email = request.data('username')
password = request.data('password')
user = authenticate(email=email, password=password)
if user and user.is_active:
return Response(user_details,status=HTTP_200_OK)
else:
res = {'error': 'can not authenticate with the given credentials'}
return Response(res, status=status.HTTP_400_BAD_REQUEST)
except KeyError:
res = {'error': 'please provide a username and a password'}
با استفاده از try/except
برای گرفتن استثنا، کاربر ما به جای اینکه سرور ما را خراب کند، خطا را مشاهده می کند.
IndentationError Exception
این نوع استثنا زمانی مطرح می شود که کد شما به درستی تورفتگی نداشته باشد. پایتون به جای استفاده از پرانتزهای فرفری برای تعیین محدوده، از تورفتگی استفاده می کند، بنابراین مهم است که تورفتگی را به درستی دریافت کنید، که هدف این استثناست.
بیایید تابعی بنویسیم که زوج بودن یک عدد را بررسی کند:
def is_even(number):
if number % 2 == 0:
print(" %s is an even number" % (number))
else:
print("%s is an odd number" % (number))
print(is_even(1))
print(is_even(2))
این تابع منجر به یک خطای تورفتگی می شود روی هر دو خط 2 و 4 چون انتظار دارد کد با 8 فاصله تورفتگی داشته باشد نه 4.
اگر برنامه را اجرا کنید، خروجی زیر را می دهد:
$ python is_even.py
File "is_even.py", line 3
print(" %s is an even number" % (number))
^
IndentationError: expected an indented block
استثنا خطای دستوری
این یکی از رایج ترین انواع استثناها در پایتون است. زمانی رخ می دهد که در نحو کد شما خطایی وجود داشته باشد.
بیایید به مثال زیر نگاه کنیم:
def is_odd(n):
if n % 2 != 0:
print(it's odd)
else:
print("not odd")
print(is_odd(7))
خروجی این کد منجر به یک نحو نامعتبر در خط 3 می شود زیرا رشته “it’s odd” در داخل گیومه قرار نمی گیرد:
$ python is_odd.py
File "is_odd.py", line 3
print(it's odd)
^
SyntaxError: EOL while scanning string literal
به خاطر داشته باشید که انواع مختلفی از خطاهای نحوی وجود دارد و این تنها یک مثال است.
TypeError Exception
این استثنا زمانی مطرح می شود که عملیات یا تابعی که برای نوع داده مشخص شده نامعتبر است، تلاش می شود. در مثال زیر تابع sum_of_numbers
2 آرگومان می گیرد و آنها را با هم جمع می کند. هنگامی که شما سعی می کنید تابع را با 3 آرگومان فراخوانی کنید، یک استثنا TypeError ایجاد می کند زیرا فقط 2 آرگومان را انتظار دارد:
def sum_of_numbers(a, b):
return a + b
print(sum_of_numbers(1, 2, 7))
با اجرای این کد نتیجه زیر به دست می آید:
$ python sum_of_numbers.py
Traceback (most recent call last):
File "sum_of_numbers.py", line 4, in <module>
print(sum_of_numbers(1, 2, 7))
TypeError: sum_of_numbers() takes exactly 2 arguments (3 given)
این امتحان کنید/به جز، دیگر، و سرانجام بندها
چندین مؤلفه دیگر برای رسیدگی به استثنا وجود دارد و آن ها عبارتند از else
و finally
بندها
ما قبلاً توانستهایم از دستورات try and catch استفاده کنیم که برای گرفتن خطاها استفاده میشود. حالا بیایید نگاه کنیم else
و finally
بیانیه ها نیز
این دیگر عبارت
این else
زمانی که برنامه این کار را انجام می دهد از clause برای اجرای کد استفاده می شود نه یک استثنا مطرح کنید همچنین بهتر است از else
بند از اضافه کردن کد اضافی به try
عبارت. این به این دلیل است که از گرفتن ناخواسته استثنایی که توسط کد محافظت شده توسط کد ایجاد نشده است جلوگیری می کند. try/except
بیانیه.
مثالی را که در ابتدای این آموزش استفاده کردیم، در نظر بگیرید، اما در عوض، میخواهیم آن را اجرا کنیم print
بیانیه در داخل else
بیانیه:
while True:
try:
x = int(raw_input("Please enter a number: "))
except ValueError:
print("Please enter a valid number!")
else:
print("%s squared is %s" % (x, x**2))
اجرای این کد همان عملکرد قبلی را فراهم می کند، با این تفاوت که افراد مستعد خطا را ایزوله می کند int(raw_input(...))
کد در try
بیانیه، و کد “ایمن” در else
بیانیه:
$ python else_squared.py
Please enter a number: 3
3 squared is 9
Please enter a number: 4
4 squared is 16
Please enter a number: five
Please enter a valid number!
Please enter a number: 5
5 squared is 25
این سرانجام عبارت
این بند به منظور تعریف اقدامات پاکسازی است که باید بدون توجه به اینکه استثنایی مطرح شده است یا خیر، انجام شود.
آ finally
بند همیشه باید قبل از خروج از آن اجرا شود try/except
بیانیه، چه استثنا رخ داده باشد یا نه. این معمولاً برای پاکسازی، مانند بستن یک فایل باز استفاده می شود.
بیایید شامل finally
بند در مثال ما:
count = 0
while True:
try:
x = int(raw_input("Please enter a number: "))
except ValueError:
print("Please enter a valid number!")
else:
print("%s squared is %s" % (x, x**2))
finally:
print("Ran %s time(s)" % count)
اجرای این کد شبیه به قبل است، با این تفاوت که اکنون میتوانیم بدون در نظر گرفتن اینکه آیا یک استثنا مطرح شده است یا خیر، میتوانیم ببینیم که حلقه ما چند بار اجرا شده است:
$ python finally_squared.py
Please enter a number: 3
3 squared is 9
Ran 1 time(s)
Please enter a number: 4
4 squared is 16
Ran 2 time(s)
Please enter a number: five
Please enter a valid number!
Ran 3 time(s)
Please enter a number: 5
5 squared is 25
Ran 4 time(s)
نتیجه
در این راهنما، به طور خلاصه توضیح دادیم که چگونه استثناها را در پایتون با استفاده از try/except
عبارات، از جمله برخی از اجزای اختیاری، else
و finally
. امیدوارم این آموزش هر گونه سردرگمی را که داشتید برطرف کرده باشد روی استثناهای پایتون
اگر میخواهید اطلاعات بیشتری کسب کنید، میتوانید اطلاعات بیشتری را در این بخش بیابید خطاها و استثنائات بخش اسناد پایتون
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-29 09:17:08