ข้อยกเว้นและคลาสข้อยกเว้น
โดยทั่วไปข้อยกเว้นคืออาการผิดปกติใด ๆ โดยทั่วไปข้อยกเว้นจะบ่งบอกถึงข้อผิดพลาด แต่บางครั้งก็จงใจใส่ไว้ในโปรแกรมในกรณีเช่นการยุติขั้นตอนก่อนกำหนดหรือกู้คืนจากปัญหาการขาดแคลนทรัพยากร มีข้อยกเว้นในตัวจำนวนมากซึ่งระบุเงื่อนไขเช่นการอ่านผ่านจุดสิ้นสุดของไฟล์หรือหารด้วยศูนย์ เราสามารถกำหนดข้อยกเว้นของเราเองที่เรียกว่าข้อยกเว้นแบบกำหนดเอง
การจัดการข้อยกเว้นช่วยให้คุณจัดการข้อผิดพลาดได้อย่างสง่างามและทำสิ่งที่มีความหมายเกี่ยวกับเรื่องนี้ การจัดการข้อยกเว้นมีองค์ประกอบ 2 ส่วน ได้แก่ "การขว้างปา" และ "การจับ"
การระบุข้อยกเว้น (ข้อผิดพลาด)
ข้อผิดพลาดทั้งหมดเกิดขึ้นใน Python ทำให้เกิดข้อยกเว้นซึ่งจะเป็นเงื่อนไขข้อผิดพลาดที่ระบุโดยประเภทข้อผิดพลาด
>>> #Exception
>>> 1/0
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
1/0
ZeroDivisionError: division by zero
>>>
>>> var = 20
>>> print(ver)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
print(ver)
NameError: name 'ver' is not defined
>>> #Above as we have misspelled a variable name so we get an NameError.
>>>
>>> print('hello)
SyntaxError: EOL while scanning string literal
>>> #Above we have not closed the quote in a string, so we get SyntaxError.
>>>
>>> #Below we are asking for a key, that doen't exists.
>>> mydict = {}
>>> mydict['x']
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
mydict['x']
KeyError: 'x'
>>> #Above keyError
>>>
>>> #Below asking for a index that didn't exist in a list.
>>> mylist = [1,2,3,4]
>>> mylist[5]
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
mylist[5]
IndexError: list index out of range
>>> #Above, index out of range, raised IndexError.
ข้อยกเว้นในการจับ / ดัก
เมื่อมีสิ่งผิดปกติเกิดขึ้นในโปรแกรมของคุณและคุณต้องการจัดการโดยใช้กลไกการยกเว้นคุณ 'โยนข้อยกเว้น' คำหลักพยายามและยกเว้นใช้เพื่อตรวจจับข้อยกเว้น เมื่อใดก็ตามที่เกิดข้อผิดพลาดขึ้นภายใน try block Python จะค้นหาการจับคู่ยกเว้นบล็อกที่จะจัดการ หากมีการดำเนินการจะกระโดดไปที่นั่น
ไวยากรณ์
try:
#write some code
#that might throw some exception
except <ExceptionType>:
# Exception handler, alert the user
รหัสภายในคำสั่ง try จะถูกเรียกใช้คำสั่งโดยคำสั่ง
หากมีข้อยกเว้นเกิดขึ้นส่วนที่เหลือของ try block จะถูกข้ามและข้อยกเว้นจะถูกดำเนินการ
try:
some statement here
except:
exception handling
ลองเขียนโค้ดดูว่าจะเกิดอะไรขึ้นเมื่อคุณไม่ใช้กลไกจัดการข้อผิดพลาดใด ๆ ในโปรแกรมของคุณ
number = int(input('Please enter the number between 1 & 10: '))
print('You have entered number',number)
โปรแกรมด้านบนจะทำงานได้อย่างถูกต้องตราบเท่าที่ผู้ใช้ป้อนตัวเลข แต่จะเกิดอะไรขึ้นหากผู้ใช้พยายามใส่ข้อมูลประเภทอื่น (เช่นสตริงหรือรายการ)
Please enter the number between 1 > 10: 'Hi'
Traceback (most recent call last):
File "C:/Python/Python361/exception2.py", line 1, in <module>
number = int(input('Please enter the number between 1 & 10: '))
ValueError: invalid literal for int() with base 10: "'Hi'"
ตอนนี้ ValueError เป็นประเภทข้อยกเว้น ลองเขียนโค้ดด้านบนใหม่ด้วยการจัดการข้อยกเว้น
import sys
print('Previous code with exception handling')
try:
number = int(input('Enter number between 1 > 10: '))
except(ValueError):
print('Error..numbers only')
sys.exit()
print('You have entered number: ',number)
หากเรารันโปรแกรมและป้อนสตริง (แทนที่จะเป็นตัวเลข) เราจะเห็นว่าเราได้ผลลัพธ์ที่แตกต่างกัน
Previous code with exception handling
Enter number between 1 > 10: 'Hi'
Error..numbers only
การเพิ่มข้อยกเว้น
ในการเพิ่มข้อยกเว้นของคุณจากวิธีการของคุณเองคุณต้องใช้คำหลักที่เพิ่มขึ้นเช่นนี้
raise ExceptionClass(‘Some Text Here’)
ลองมาเป็นตัวอย่าง
def enterAge(age):
if age<0:
raise ValueError('Only positive integers are allowed')
if age % 2 ==0:
print('Entered Age is even')
else:
print('Entered Age is odd')
try:
num = int(input('Enter your age: '))
enterAge(num)
except ValueError:
print('Only positive integers are allowed')
รันโปรแกรมและป้อนจำนวนเต็มบวก
ผลลัพธ์ที่คาดหวัง
Enter your age: 12
Entered Age is even
แต่เมื่อเราพยายามป้อนจำนวนลบเราจะได้
ผลลัพธ์ที่คาดหวัง
Enter your age: -2
Only positive integers are allowed
การสร้างคลาสข้อยกเว้นแบบกำหนดเอง
คุณสามารถสร้างคลาสข้อยกเว้นแบบกำหนดเองโดยการขยายคลาส BaseException หรือคลาสย่อยของ BaseException
จากแผนภาพด้านบนเราจะเห็นคลาสข้อยกเว้นส่วนใหญ่ใน Python ขยายจากคลาส BaseException คุณสามารถได้รับคลาสข้อยกเว้นของคุณเองจากคลาส BaseException หรือจากคลาสย่อย
สร้างไฟล์ใหม่ชื่อ NegativeNumberException.py และเขียนโค้ดต่อไปนี้
class NegativeNumberException(RuntimeError):
def __init__(self, age):
super().__init__()
self.age = age
โค้ดด้านบนสร้างคลาสข้อยกเว้นใหม่ชื่อ NegativeNumberException ซึ่งประกอบด้วยคอนสตรัคเตอร์เท่านั้นที่เรียกตัวสร้างคลาสพาเรนต์โดยใช้ super () __ init __ () และกำหนดอายุ
ตอนนี้เพื่อสร้างคลาสข้อยกเว้นของคุณเองจะเขียนโค้ดและนำเข้าคลาสข้อยกเว้นใหม่
from NegativeNumberException import NegativeNumberException
def enterage(age):
if age < 0:
raise NegativeNumberException('Only positive integers are allowed')
if age % 2 == 0:
print('Age is Even')
else:
print('Age is Odd')
try:
num = int(input('Enter your age: '))
enterage(num)
except NegativeNumberException:
print('Only positive integers are allowed')
except:
print('Something is wrong')
เอาต์พุต
Enter your age: -2
Only positive integers are allowed
อีกวิธีในการสร้างคลาส Exception แบบกำหนดเอง
class customException(Exception):
def __init__(self, value):
self.parameter = value
def __str__(self):
return repr(self.parameter)
try:
raise customException('My Useful Error Message!')
except customException as instance:
print('Caught: ' + instance.parameter)
เอาต์พุต
Caught: My Useful Error Message!
ลำดับชั้นของข้อยกเว้น
ลำดับชั้นของคลาสสำหรับข้อยกเว้นในตัวคือ -
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning