021-88881776

آموزش استثنائات در پایتون

آموزش استثنائات در پایتون، خطاها و استثناها در پایتون بخشی از فرآیند اجرای برنامه هستند و معمولاً زمانی رخ می‌دهند که یک شرایط غیرعادی یا غیرمنتظره در کد ایجاد شود. پایتون ابزارهای قدرتمندی برای مدیریت و رفع خطاها ارائه می‌دهد.

1. خطاها و استثناها در پایتون

 

انواع خطاها در پایتون

  1. خطاهای نحوی (Syntax Errors): زمانی رخ می‌دهند که کد با قوانین نحوی پایتون مطابقت ندارد.
    print("Hello World!  # خطای نحوی
    

    خروجی:

    SyntaxError: EOL while scanning string literal
    
  2. استثناها (Exceptions): خطاهایی هستند که در زمان اجرا (Runtime) رخ می‌دهند، مانند تقسیم بر صفر یا دسترسی به یک متغیر تعریف نشده.
    result = 10 / 0
    

    خروجی:

    ZeroDivisionError: division by zero
    

 

مدیریت استثناها با بلوک try-except

برای مدیریت استثناها از بلوک‌های try-except استفاده می‌شود.

ساختار کلی:

try:
    # کدی که ممکن است خطا ایجاد کند
except نوع_استثنا:
    # کدی برای مدیریت خطا

مثال:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Cannot divide by zero!")

خروجی:

Cannot divide by zero!

 

استفاده از بلوک else

بلوک else زمانی اجرا می‌شود که هیچ استثنایی رخ ندهد.

مثال:

try:
    result = 10 / 2
except ZeroDivisionError:
    print("Cannot divide by zero!")
else:
    print(f"Result is {result}")

خروجی:

Result is 5.0

 

استفاده از بلوک finally

بلوک finally همیشه اجرا می‌شود، چه استثنایی رخ دهد یا نه.

مثال:

try:
    file = open("sample.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("File not found!")
finally:
    print("Closing the file (if open).")

خروجی در صورت عدم وجود فایل:

File not found!
Closing the file (if open).

 

مدیریت چندین استثنا

برای مدیریت چندین نوع استثنا می‌توان از چند بلوک except استفاده کرد.

مثال:

try:
    num = int(input("Enter a number: "))
    result = 10 / num
except ValueError:
    print("Invalid input! Please enter a number.")
except ZeroDivisionError:
    print("Cannot divide by zero!")

ورودی نامعتبر:

Invalid input! Please enter a number.

ورودی صفر:

Cannot divide by zero!

 

تعریف استثنای سفارشی

می‌توانید استثناهای خود را با ایجاد کلاس‌هایی که از Exception ارث می‌برند، تعریف کنید.

مثال:

class NegativeNumberError(Exception):
    pass

def square_root(num):
    if num < 0:
        raise NegativeNumberError("Cannot calculate square root of a negative number.")
    return num ** 0.5

try:
    result = square_root(-4)
except NegativeNumberError as e:
    print(e)

خروجی:

Cannot calculate square root of a negative number.

 

بهترین روش‌ها در مدیریت استثناها

  1. استثناهای خاص را مدیریت کنید: از مدیریت کلی استثناها اجتناب کنید مگر اینکه ضروری باشد.
    try:
        result = 10 / 0
    except Exception as e:
        print(f"An error occurred: {e}")
    
  2. استفاده از بلوک finally: برای تمیزکاری مانند بستن فایل‌ها یا قطع ارتباط.
  3. تعریف استثنای سفارشی: زمانی که نیاز به کنترل خطاهای خاص در برنامه دارید.
  4. اجتناب از مدیریت غیرضروری: فقط زمانی از مدیریت استثنا استفاده کنید که انتظار خطای خاصی دارید.

 

به طور کلی می توان گفت:

مدیریت خطاها و استثناها در پایتون یکی از جنبه‌های ضروری برای نوشتن کدهای پایدار و قابل اعتماد است. با استفاده از ابزارهای ارائه شده توسط پایتون، می‌توانید شرایط غیرمنتظره را به درستی مدیریت کرده و تجربه کاربری بهتری ایجاد کنید.

 

2. استفاده از try, except, و finally در پایتون

بلوک‌های try, except, و finally ابزاری قدرتمند برای مدیریت خطاها و تمیزکاری ارائه می‌دهند. این ساختارها به شما امکان می‌دهند که به صورت امن با شرایط غیرمنتظره و خطاهای احتمالی در زمان اجرای برنامه برخورد کنید.

 

ساختار کلی

try:
    # کدی که ممکن است خطا ایجاد کند
except نوع_استثنا:
    # کدی برای مدیریت خطا
finally:
    # کدی که همیشه اجرا می‌شود

 

مثال پایه‌ای

try:
    number = int(input("Enter a number: "))
    result = 10 / number
    print(f"Result: {result}")
except ValueError:
    print("Invalid input! Please enter a valid number.")
except ZeroDivisionError:
    print("Cannot divide by zero!")
finally:
    print("Execution complete.")

 

توضیح:

  • بلوک try کدی را شامل می‌شود که ممکن است خطا ایجاد کند.
  • بلوک‌های except برای مدیریت خطاهای خاص مانند ValueError و ZeroDivisionError هستند.
  • بلوک finally کدی را اجرا می‌کند که حتی در صورت وقوع خطا یا عدم وقوع آن اجرا خواهد شد.

ورودی مثال:

  1. ورودی عدد 2:
Result: 5.0
Execution complete.
  1. ورودی عدد 0:
Cannot divide by zero!
Execution complete.
  1. ورودی نامعتبر:
Invalid input! Please enter a valid number.
Execution complete.

 

استفاده از چندین بلوک except

برای مدیریت خطاهای مختلف می‌توانید از چندین بلوک except استفاده کنید.

مثال:

try:
    numbers = [1, 2, 3]
    index = int(input("Enter an index: "))
    print(f"Number: {numbers[index]}")
except IndexError:
    print("Index out of range!")
except ValueError:
    print("Please enter a valid number.")
finally:
    print("Program finished.")

 

 

ورودی مثال:

  1. ورودی معتبر:
Enter an index: 1
Number: 2
Program finished.
  1. ورودی خارج از محدوده:
Enter an index: 5
Index out of range!
Program finished.
  1. ورودی نامعتبر:
Enter an index: a
Please enter a valid number.
Program finished.

 

کاربرد بلوک finally

بلوک finally معمولاً برای تمیزکاری مانند بستن فایل‌ها یا قطع اتصال شبکه استفاده می‌شود.

مثال با فایل‌ها:

try:
    file = open("example.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("The file does not exist.")
finally:
    file.close()
    print("File closed.")

 

 

خروجی: اگر فایل وجود نداشته باشد:

The file does not exist.
File closed.

 

 

اگر فایل وجود داشته باشد:

<contents of the file>
File closed.

 

ترکیب try, except, و else

از بلوک else می‌توان برای اجرای کدی که تنها در صورت عدم وقوع خطا اجرا می‌شود، استفاده کرد.

مثال:

try:
    number = int(input("Enter a number: "))
    result = 10 / number
except ZeroDivisionError:
    print("Cannot divide by zero!")
except ValueError:
    print("Invalid input! Please enter a valid number.")
else:
    print(f"Result: {result}")
finally:
    print("Execution finished.")

 

 

ورودی مثال:

  1. ورودی معتبر:
Enter a number: 2
Result: 5.0
Execution finished.
  1. ورودی نامعتبر:
Enter a number: a
Invalid input! Please enter a valid number.
Execution finished.
  1. تقسیم بر صفر:
Enter a number: 0
Cannot divide by zero!
Execution finished.

به طور گلی می توان گفت:

ساختارهای try, except, و finally در پایتون به شما امکان می‌دهند که خطاهای برنامه را به صورت موثر مدیریت کرده و حتی در صورت وقوع خطا، برنامه را در حالت پایدار نگه دارید. با تمرین و استفاده مناسب از این ابزارها، می‌توانید برنامه‌هایی مقاوم‌تر و قابل اعتمادتر بنویسید.

 

3. خطاهای خاص و مدیریت خطاها در پایتون

پایتون ابزارهای قدرتمندی برای شناسایی و مدیریت خطاها ارائه می‌دهد. خطاها می‌توانند در طول اجرای برنامه رخ دهند و اگر به درستی مدیریت نشوند، برنامه را متوقف کنند. برای مدیریت این موارد، از ساختارهای مناسب مانند try, except و تعریف استثناهای خاص استفاده می‌کنیم.

 

انواع خطاهای خاص

  1. ZeroDivisionError: زمانی رخ می‌دهد که عددی بر صفر تقسیم شود.
    try:
        result = 10 / 0
    except ZeroDivisionError:
        print("Cannot divide by zero!")
    
  2. ValueError: هنگامی که یک مقدار نامعتبر به تابعی ارسال شود.
    try:
        number = int("abc")
    except ValueError:
        print("Invalid input! Please enter a number.")
    
  3. IndexError: زمانی که تلاش شود به اندیسی خارج از محدوده یک لیست دسترسی پیدا کنیم.
    try:
        my_list = [1, 2, 3]
        print(my_list[5])
    except IndexError:
        print("Index out of range!")
    
  4. KeyError: زمانی که یک کلید ناموجود از دیکشنری درخواست شود.
    try:
        my_dict = {"name": "Alice"}
        print(my_dict["age"])
    except KeyError:
        print("Key not found in dictionary!")
    
  5. FileNotFoundError: زمانی که فایلی که تلاش می‌شود باز شود، وجود نداشته باشد.
    try:
        with open("nonexistent_file.txt", "r") as file:
            content = file.read()
    except FileNotFoundError:
        print("File does not exist!")
    
  6. TypeError: زمانی که یک نوع داده نامعتبر به تابع یا عملیات ارسال شود.
    try:
        result = "string" + 5
    except TypeError:
        print("Type mismatch error!")
    

 

مدیریت چندین خطای خاص

با استفاده از چندین بلوک except می‌توانید خطاهای مختلف را جداگانه مدیریت کنید.

مثال:

try:
    value = int(input("Enter a number: "))
    result = 10 / value
    my_list = [1, 2, 3]
    print(my_list[value])
except ZeroDivisionError:
    print("Cannot divide by zero!")
except ValueError:
    print("Please enter a valid number.")
except IndexError:
    print("Index out of range!")

 

استثناهای سفارشی:

می‌توانید استثناهای خاص خود را با تعریف یک کلاس جدید ایجاد کنید. این کلاس باید از `Exception` ارث ببرد.

مثال:

class NegativeNumberError(Exception):
pass

def calculate_square_root(number):
if number < 0:
raise NegativeNumberError("Cannot calculate square root of a negative number!")
return number ** 0.5

try:
result = calculate_square_root(-9)
except NegativeNumberError as e:
print(e)

 

خروجی:

Cannot calculate square root of a negative number!

 

ترکیب مدیریت خطاها با else و finally

استفاده از else

بلوک else زمانی اجرا می‌شود که هیچ خطایی رخ ندهد.

مثال:

try:
    value = int(input("Enter a number: "))
    result = 10 / value
except ZeroDivisionError:
    print("Cannot divide by zero!")
except ValueError:
    print("Please enter a valid number.")
else:
    print(f"Result is {result}")

 

 

ورودی معتبر:

Result is 5.0

 

استفاده از finally

بلوک finally همیشه اجرا می‌شود، چه خطایی رخ دهد یا خیر.

مثال:

try:
    file = open("example.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("File not found!")
finally:
    print("Cleaning up resources.")

 

 

خروجی در صورت عدم وجود فایل:

File not found!
Cleaning up resources.

 

 

به طور کلی می توان گفت:

مدیریت خطاهای خاص در پایتون به شما کمک می‌کند برنامه‌های پایدارتر و کاربرپسندتری ایجاد کنید. با تعریف استثناهای خاص و استفاده بهینه از ابزارهای ارائه شده مانند try, except, else و finally, می‌توانید کنترل بهتری بر روی رفتار برنامه خود داشته باشید.

آموزش استثنائات در پایتون

دیدگاه های شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *