وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

مدیریت استثناء پایتون

0 3
زمان لازم برای مطالعه: 6 دقیقه


معرفی

استثنا پایتون ساختاری است که برای سیگنال دادن به یک رویداد مهم، معمولاً یک خطا، که هنگام اجرای یک برنامه رخ می دهد، استفاده می شود. یک استثنا ممکن است باعث شود که برنامه به درستی “گرفته نشده” (یعنی به درستی مدیریت شود) متوقف شود. اگر فکر می کنید که برنامه شما ممکن است در هنگام اجرا یک استثنا ایجاد کند، استفاده از آن برای شما مفید خواهد بود 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 کنترل کننده بند

پیشنهاد می‌کنیم بخوانید:  'is' در مقابل '==' در پایتون - مقایسه شی

انواع استثناها در پایتون

پایتون چندین استثنا داخلی دارد. بیایید نگاهی به برخی از رایج ترین استثناها بیندازیم تا بتوانید دیدگاهی از چیستی آنها و روش استفاده از آنها داشته باشید.

استثناء 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 بندها

پیشنهاد می‌کنیم بخوانید:  نوشتن روی یک فایل با پایتون print() تابع

ما قبلاً توانسته‌ایم از دستورات 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

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید