Python - การจัดการข้อยกเว้น
Python มีคุณสมบัติที่สำคัญมากสองประการเพื่อจัดการกับข้อผิดพลาดที่ไม่คาดคิดในโปรแกรม Python ของคุณและเพื่อเพิ่มความสามารถในการดีบัก -
Exception Handling- สิ่งนี้จะกล่าวถึงในบทช่วยสอนนี้ นี่คือรายการข้อยกเว้นมาตรฐานที่สามารถใช้ได้ในหลาม: ข้อยกเว้นมาตรฐาน
Assertions- สิ่งนี้จะกล่าวถึงในAssertions ในบทช่วยสอนPython
รายการข้อยกเว้นมาตรฐาน -
ซีเนียร์ | ชื่อและคำอธิบายข้อยกเว้น |
---|---|
1 | Exception คลาสพื้นฐานสำหรับข้อยกเว้นทั้งหมด |
2 | StopIteration เพิ่มขึ้นเมื่อเมธอด next () ของตัววนซ้ำไม่ชี้ไปที่วัตถุใด ๆ |
3 | SystemExit เพิ่มขึ้นโดยฟังก์ชัน sys.exit () |
4 | StandardError คลาสพื้นฐานสำหรับข้อยกเว้นในตัวทั้งหมดยกเว้น StopIteration และ SystemExit |
5 | ArithmeticError คลาสฐานสำหรับข้อผิดพลาดทั้งหมดที่เกิดขึ้นสำหรับการคำนวณตัวเลข |
6 | OverflowError เพิ่มขึ้นเมื่อการคำนวณเกินขีด จำกัด สูงสุดสำหรับประเภทตัวเลข |
7 | FloatingPointError เพิ่มขึ้นเมื่อการคำนวณจุดลอยตัวล้มเหลว |
8 | ZeroDivisionError เพิ่มขึ้นเมื่อการหารหรือโมดูโลด้วยศูนย์เกิดขึ้นสำหรับประเภทตัวเลขทั้งหมด |
9 | AssertionError ยกขึ้นในกรณีที่คำสั่ง Assert ล้มเหลว |
10 | AttributeError เพิ่มขึ้นในกรณีที่การอ้างอิงแอตทริบิวต์หรือการมอบหมายล้มเหลว |
11 | EOFError เพิ่มขึ้นเมื่อไม่มีอินพุตจากฟังก์ชัน raw_input () หรืออินพุต () และถึงจุดสิ้นสุดของไฟล์ |
12 | ImportError เพิ่มขึ้นเมื่อคำสั่งนำเข้าล้มเหลว |
13 | KeyboardInterrupt เพิ่มขึ้นเมื่อผู้ใช้ขัดจังหวะการทำงานของโปรแกรมโดยปกติจะกด Ctrl + c |
14 | LookupError คลาสพื้นฐานสำหรับข้อผิดพลาดในการค้นหาทั้งหมด |
15 | IndexError เพิ่มขึ้นเมื่อไม่พบดัชนีในลำดับ |
16 | KeyError เพิ่มขึ้นเมื่อไม่พบคีย์ที่ระบุในพจนานุกรม |
17 | NameError เพิ่มขึ้นเมื่อไม่พบตัวระบุในเนมสเปซโลคัลหรือโกลบอล |
18 | UnboundLocalError เพิ่มขึ้นเมื่อพยายามเข้าถึงตัวแปรโลคัลในฟังก์ชันหรือวิธีการ แต่ไม่มีการกำหนดค่าให้ |
19 | EnvironmentError คลาสพื้นฐานสำหรับข้อยกเว้นทั้งหมดที่เกิดขึ้นนอกสภาพแวดล้อม Python |
20 | IOError เพิ่มขึ้นเมื่อการดำเนินการอินพุต / เอาต์พุตล้มเหลวเช่นคำสั่งพิมพ์หรือฟังก์ชัน open () เมื่อพยายามเปิดไฟล์ที่ไม่มีอยู่ |
21 | IOError เพิ่มขึ้นสำหรับข้อผิดพลาดที่เกี่ยวข้องกับระบบปฏิบัติการ |
22 | SyntaxError เพิ่มขึ้นเมื่อมีข้อผิดพลาดในไวยากรณ์ Python |
23 | IndentationError เพิ่มขึ้นเมื่อไม่ได้ระบุการเยื้องอย่างถูกต้อง |
24 | SystemError เพิ่มขึ้นเมื่อล่ามพบปัญหาภายใน แต่เมื่อพบข้อผิดพลาดนี้ตัวแปล Python ไม่ออก |
25 | SystemExit เพิ่มขึ้นเมื่อล่าม Python เลิกใช้งานโดยใช้ฟังก์ชัน sys.exit () หากไม่ได้รับการจัดการในโค้ดทำให้ล่ามออก |
26 | TypeError เพิ่มขึ้นเมื่อมีการพยายามดำเนินการหรือฟังก์ชันที่ไม่ถูกต้องสำหรับชนิดข้อมูลที่ระบุ |
27 | ValueError เพิ่มขึ้นเมื่อฟังก์ชันในตัวสำหรับชนิดข้อมูลมีประเภทของอาร์กิวเมนต์ที่ถูกต้อง แต่อาร์กิวเมนต์มีการระบุค่าที่ไม่ถูกต้อง |
28 | RuntimeError เพิ่มขึ้นเมื่อข้อผิดพลาดที่สร้างขึ้นไม่อยู่ในหมวดหมู่ใด ๆ |
29 | NotImplementedError เกิดขึ้นเมื่อวิธีนามธรรมที่ต้องนำไปใช้ในคลาสที่สืบทอดมาไม่ได้ถูกนำมาใช้จริง |
การยืนยันใน Python
การยืนยันคือการตรวจสอบความมีสติที่คุณสามารถเปิดหรือปิดเมื่อคุณทดสอบโปรแกรมเสร็จแล้ว
วิธีที่ง่ายที่สุดในการคิดการยืนยันคือการเปรียบเสมือนกับก raise-ifคำสั่ง (หรือเพื่อให้ถูกต้องมากขึ้นคำสั่งเพิ่มถ้าไม่) มีการทดสอบนิพจน์และหากผลลัพธ์เป็นเท็จจะมีการเพิ่มข้อยกเว้น
การยืนยันดำเนินการโดยคำสั่ง assert ซึ่งเป็นคีย์เวิร์ดใหม่ล่าสุดของ Python ซึ่งเปิดตัวในเวอร์ชัน 1.5
โปรแกรมเมอร์มักวางคำยืนยันไว้ที่จุดเริ่มต้นของฟังก์ชันเพื่อตรวจสอบอินพุตที่ถูกต้องและหลังจากเรียกใช้ฟังก์ชันเพื่อตรวจสอบเอาต์พุตที่ถูกต้อง
ยืนยันคำชี้แจง
เมื่อพบคำสั่งยืนยัน Python จะประเมินนิพจน์ประกอบซึ่งหวังว่าจะเป็นจริง ถ้านิพจน์เป็นเท็จ Python จะเพิ่มข้อยกเว้นAssertionError
syntax สำหรับการยืนยันคือ -
assert Expression[, Arguments]
หากการยืนยันล้มเหลว Python จะใช้ ArgumentExpression เป็นอาร์กิวเมนต์สำหรับ AssertionError ข้อยกเว้น AssertionError สามารถตรวจจับและจัดการได้เช่นเดียวกับข้อยกเว้นอื่น ๆ โดยใช้คำสั่ง try-except แต่หากไม่ได้รับการจัดการข้อยกเว้นจะยุติโปรแกรมและสร้างการย้อนกลับ
ตัวอย่าง
นี่คือฟังก์ชันที่แปลงอุณหภูมิจากองศาเคลวินเป็นองศาฟาเรนไฮต์ เนื่องจากศูนย์องศาเคลวินเย็นที่สุดเท่าที่จะได้รับฟังก์ชั่นนี้จะป้องกันไม่ให้อุณหภูมิติดลบ -
#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
ข้อยกเว้นคืออะไร?
ข้อยกเว้นคือเหตุการณ์ที่เกิดขึ้นระหว่างการทำงานของโปรแกรมที่ขัดขวางขั้นตอนปกติของคำสั่งของโปรแกรม โดยทั่วไปเมื่อสคริปต์ Python พบสถานการณ์ที่ไม่สามารถรับมือได้จะมีข้อยกเว้น ข้อยกเว้นคือวัตถุ Python ที่แสดงถึงข้อผิดพลาด
เมื่อสคริปต์ Python เกิดข้อยกเว้นก็ต้องจัดการข้อยกเว้นทันทีมิฉะนั้นจะยุติและออกจากระบบ
การจัดการข้อยกเว้น
หากคุณมีรหัสที่น่าสงสัยซึ่งอาจทำให้เกิดข้อยกเว้นคุณสามารถป้องกันโปรแกรมของคุณได้โดยการวางรหัสที่น่าสงสัยในไฟล์try:บล็อก. หลังจากลอง: บล็อกรวมไฟล์except: ตามด้วยบล็อกรหัสที่จัดการปัญหาอย่างหรูหราที่สุด
ไวยากรณ์
นี่คือไวยากรณ์ง่ายๆของการลอง .... ยกเว้น ... elseบล็อก -
try:
You do your operations here;
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
ต่อไปนี้เป็นประเด็นสำคัญบางประการเกี่ยวกับไวยากรณ์ดังกล่าวข้างต้น -
คำสั่ง try ครั้งเดียวสามารถมีได้หลายคำสั่งยกเว้น สิ่งนี้มีประโยชน์เมื่อ try block มีข้อความที่อาจทำให้เกิดข้อยกเว้นประเภทต่างๆ
คุณยังสามารถระบุข้อยกเว้นทั่วไปซึ่งจัดการกับข้อยกเว้นใด ๆ
หลังจากยกเว้นอนุประโยคคุณสามารถใส่ else-clause ได้ โค้ดใน else-block จะดำเนินการหากโค้ดใน try: block ไม่ทำให้เกิดข้อยกเว้น
else-block เป็นสถานที่ที่ดีสำหรับโค้ดที่ไม่จำเป็นต้องใช้ try: block's protection
ตัวอย่าง
ตัวอย่างนี้เปิดไฟล์เขียนเนื้อหาในไฟล์และออกมาอย่างสวยงามเพราะไม่มีปัญหาเลย -
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
fh.close()
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Written content in the file successfully
ตัวอย่าง
ตัวอย่างนี้พยายามเปิดไฟล์ที่คุณไม่มีสิทธิ์ในการเขียนดังนั้นจึงมีข้อยกเว้น -
#!/usr/bin/python
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Error: can't find file or read data
ยกเว้นข้อไม่มีข้อยกเว้น
คุณยังสามารถใช้คำสั่งยกเว้นโดยไม่มีข้อยกเว้นที่กำหนดไว้ดังต่อไปนี้ -
try:
You do your operations here;
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
ก. ชนิดนี้ try-exceptคำสั่งจับข้อยกเว้นทั้งหมดที่เกิดขึ้น การใช้คำสั่ง try-except แบบนี้ไม่ถือว่าเป็นแนวทางปฏิบัติในการเขียนโปรแกรมที่ดีเนื่องจากสามารถจับข้อยกเว้นทั้งหมดได้ แต่ไม่ได้ทำให้โปรแกรมเมอร์ระบุสาเหตุของปัญหาที่อาจเกิดขึ้นได้
ยกเว้นข้อมีข้อยกเว้นหลาย
คุณยังสามารถใช้คำสั่งยกเว้นเดียวกันเพื่อจัดการข้อยกเว้นต่างๆได้ดังนี้ -
try:
You do your operations here;
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
ข้อพยายามในที่สุด
คุณสามารถใช้ไฟล์ finally: บล็อกพร้อมกับ try:บล็อก. บล็อกสุดท้ายคือที่สำหรับใส่โค้ดใด ๆ ที่ต้องดำเนินการไม่ว่าการบล็อกจะมีข้อยกเว้นหรือไม่ก็ตาม ไวยากรณ์ของคำสั่ง try-ในที่สุดคือ -
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
คุณไม่สามารถใช้ประโยคอื่นร่วมกับอนุประโยคสุดท้ายได้
ตัวอย่าง
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print "Error: can\'t find file or read data"
หากคุณไม่ได้รับอนุญาตให้เปิดไฟล์ในโหมดการเขียนสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Error: can't find file or read data
ตัวอย่างเดียวกันสามารถเขียนได้อย่างหมดจดมากขึ้นดังนี้ -
#!/usr/bin/python
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print "Going to close the file"
fh.close()
except IOError:
print "Error: can\'t find file or read data"
เมื่อเกิดข้อยกเว้นในบล็อกลองการดำเนินการจะส่งผ่านไปยังบล็อกสุดท้ายทันที หลังจากดำเนินการคำสั่งทั้งหมดในบล็อกสุดท้ายข้อยกเว้นจะถูกเพิ่มขึ้นอีกครั้งและจะถูกจัดการในคำสั่งยกเว้นหากมีอยู่ในชั้นถัดไปที่สูงกว่าของคำสั่งtry-except
อาร์กิวเมนต์ของข้อยกเว้น
ข้อยกเว้นสามารถมีอาร์กิวเมนต์ซึ่งเป็นค่าที่ให้ข้อมูลเพิ่มเติมเกี่ยวกับปัญหา เนื้อหาของอาร์กิวเมนต์แตกต่างกันไปตามข้อยกเว้น คุณจับอาร์กิวเมนต์ของข้อยกเว้นโดยการจัดหาตัวแปรในข้อยกเว้นดังต่อไปนี้ -
try:
You do your operations here;
......................
except ExceptionType, Argument:
You can print value of Argument here...
หากคุณเขียนโค้ดเพื่อจัดการกับข้อยกเว้นเดียวคุณสามารถมีตัวแปรตามชื่อของข้อยกเว้นในคำสั่งยกเว้น หากคุณกำลังดักจับข้อยกเว้นหลายรายการคุณสามารถมีตัวแปรตามทูเพิลของข้อยกเว้น
ตัวแปรนี้ได้รับค่าของข้อยกเว้นซึ่งส่วนใหญ่มีสาเหตุของข้อยกเว้น ตัวแปรสามารถรับค่าเดียวหรือหลายค่าในรูปแบบทูเพิล ทูเพิลนี้มักประกอบด้วยสตริงข้อผิดพลาดหมายเลขข้อผิดพลาดและตำแหน่งข้อผิดพลาด
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างสำหรับข้อยกเว้นเดียว -
#!/usr/bin/python
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "The argument does not contain numbers\n", Argument
# Call above function here.
temp_convert("xyz");
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
การเพิ่มข้อยกเว้น
คุณสามารถเพิ่มข้อยกเว้นได้หลายวิธีโดยใช้คำสั่งเพิ่ม ไวยากรณ์ทั่วไปสำหรับraise คำสั่งมีดังนี้
ไวยากรณ์
raise [Exception [, args [, traceback]]]
ที่นี่Exceptionคือประเภทของข้อยกเว้น (ตัวอย่างเช่น NameError) และอาร์กิวเมนต์เป็นค่าสำหรับอาร์กิวเมนต์ข้อยกเว้น อาร์กิวเมนต์เป็นทางเลือก หากไม่ได้ระบุอาร์กิวเมนต์ข้อยกเว้นคือไม่มี
อาร์กิวเมนต์สุดท้าย traceback ยังเป็นทางเลือก (และแทบไม่ได้ใช้ในทางปฏิบัติ) และถ้ามีอยู่คืออ็อบเจ็กต์การย้อนกลับที่ใช้สำหรับข้อยกเว้น
ตัวอย่าง
ข้อยกเว้นอาจเป็นสตริงคลาสหรืออ็อบเจ็กต์ ข้อยกเว้นส่วนใหญ่ที่ Python core เพิ่มขึ้นคือคลาสโดยมีอาร์กิวเมนต์ที่เป็นอินสแตนซ์ของคลาส การกำหนดข้อยกเว้นใหม่ทำได้ค่อนข้างง่ายและทำได้ดังนี้ -
def functionName( level ):
if level < 1:
raise "Invalid level!", level
# The code below to this would not be executed
# if we raise the exception
Note:ในการตรวจจับข้อยกเว้นประโยค "ยกเว้น" ต้องอ้างถึงข้อยกเว้นเดียวกันที่โยนอ็อบเจ็กต์คลาสหรือสตริงธรรมดา ตัวอย่างเช่นในการจับข้อยกเว้นข้างต้นเราต้องเขียนข้อยกเว้นดังนี้ -
try:
Business Logic here...
except "Invalid level!":
Exception handling here...
else:
Rest of the code here...
ข้อยกเว้นที่ผู้ใช้กำหนด
Python ยังช่วยให้คุณสร้างข้อยกเว้นของคุณเองได้โดยรับคลาสจากข้อยกเว้นในตัวมาตรฐาน
นี่คือตัวอย่างที่เกี่ยวข้องกับRuntimeerror นี่ชั้นจะถูกสร้างขึ้นที่ subclassed จากRuntimeerror สิ่งนี้มีประโยชน์เมื่อคุณต้องการแสดงข้อมูลที่เฉพาะเจาะจงมากขึ้นเมื่อพบข้อยกเว้น
ในบล็อกลองข้อยกเว้นที่ผู้ใช้กำหนดจะถูกยกขึ้นและถูกจับในบล็อกยกเว้น ตัวแปรอีใช้ในการสร้างอินสแตนซ์ของระดับชั้นNetworkerror
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
ดังนั้นเมื่อคุณกำหนดคลาสข้างต้นแล้วคุณสามารถเพิ่มข้อยกเว้นได้ดังนี้ -
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args