آموزش استثنائات در پایتون، خطاها و استثناها در پایتون بخشی از فرآیند اجرای برنامه هستند و معمولاً زمانی رخ میدهند که یک شرایط غیرعادی یا غیرمنتظره در کد ایجاد شود. پایتون ابزارهای قدرتمندی برای مدیریت و رفع خطاها ارائه میدهد.
1. خطاها و استثناها در پایتون
انواع خطاها در پایتون
- خطاهای نحوی (Syntax Errors): زمانی رخ میدهند که کد با قوانین نحوی پایتون مطابقت ندارد.
print("Hello World! # خطای نحویخروجی:
SyntaxError: EOL while scanning string literal - استثناها (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.
بهترین روشها در مدیریت استثناها
- استثناهای خاص را مدیریت کنید: از مدیریت کلی استثناها اجتناب کنید مگر اینکه ضروری باشد.
try: result = 10 / 0 except Exception as e: print(f"An error occurred: {e}") - استفاده از بلوک
finally: برای تمیزکاری مانند بستن فایلها یا قطع ارتباط. - تعریف استثنای سفارشی: زمانی که نیاز به کنترل خطاهای خاص در برنامه دارید.
- اجتناب از مدیریت غیرضروری: فقط زمانی از مدیریت استثنا استفاده کنید که انتظار خطای خاصی دارید.
به طور کلی می توان گفت:
مدیریت خطاها و استثناها در پایتون یکی از جنبههای ضروری برای نوشتن کدهای پایدار و قابل اعتماد است. با استفاده از ابزارهای ارائه شده توسط پایتون، میتوانید شرایط غیرمنتظره را به درستی مدیریت کرده و تجربه کاربری بهتری ایجاد کنید.
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کدی را اجرا میکند که حتی در صورت وقوع خطا یا عدم وقوع آن اجرا خواهد شد.
ورودی مثال:
- ورودی عدد 2:
Result: 5.0
Execution complete.
- ورودی عدد 0:
Cannot divide by zero!
Execution complete.
- ورودی نامعتبر:
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.")
ورودی مثال:
- ورودی معتبر:
Enter an index: 1
Number: 2
Program finished.
- ورودی خارج از محدوده:
Enter an index: 5
Index out of range!
Program finished.
- ورودی نامعتبر:
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.")
ورودی مثال:
- ورودی معتبر:
Enter a number: 2
Result: 5.0
Execution finished.
- ورودی نامعتبر:
Enter a number: a
Invalid input! Please enter a valid number.
Execution finished.
- تقسیم بر صفر:
Enter a number: 0
Cannot divide by zero!
Execution finished.
به طور گلی می توان گفت:
ساختارهای try, except, و finally در پایتون به شما امکان میدهند که خطاهای برنامه را به صورت موثر مدیریت کرده و حتی در صورت وقوع خطا، برنامه را در حالت پایدار نگه دارید. با تمرین و استفاده مناسب از این ابزارها، میتوانید برنامههایی مقاومتر و قابل اعتمادتر بنویسید.
3. خطاهای خاص و مدیریت خطاها در پایتون
پایتون ابزارهای قدرتمندی برای شناسایی و مدیریت خطاها ارائه میدهد. خطاها میتوانند در طول اجرای برنامه رخ دهند و اگر به درستی مدیریت نشوند، برنامه را متوقف کنند. برای مدیریت این موارد، از ساختارهای مناسب مانند try, except و تعریف استثناهای خاص استفاده میکنیم.
انواع خطاهای خاص
ZeroDivisionError: زمانی رخ میدهد که عددی بر صفر تقسیم شود.try: result = 10 / 0 except ZeroDivisionError: print("Cannot divide by zero!")ValueError: هنگامی که یک مقدار نامعتبر به تابعی ارسال شود.try: number = int("abc") except ValueError: print("Invalid input! Please enter a number.")IndexError: زمانی که تلاش شود به اندیسی خارج از محدوده یک لیست دسترسی پیدا کنیم.try: my_list = [1, 2, 3] print(my_list[5]) except IndexError: print("Index out of range!")KeyError: زمانی که یک کلید ناموجود از دیکشنری درخواست شود.try: my_dict = {"name": "Alice"} print(my_dict["age"]) except KeyError: print("Key not found in dictionary!")FileNotFoundError: زمانی که فایلی که تلاش میشود باز شود، وجود نداشته باشد.try: with open("nonexistent_file.txt", "r") as file: content = file.read() except FileNotFoundError: print("File does not exist!")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, میتوانید کنترل بهتری بر روی رفتار برنامه خود داشته باشید.
