Python 3 - การจัดการข้อยกเว้น

Python มีคุณสมบัติที่สำคัญมากสองประการในการจัดการข้อผิดพลาดที่ไม่คาดคิดในโปรแกรม Python ของคุณและเพื่อเพิ่มความสามารถในการดีบัก -

  • Exception Handling- สิ่งนี้จะกล่าวถึงในบทช่วยสอนนี้ นี่คือรายการข้อยกเว้นมาตรฐานที่สามารถใช้ได้ในหลาม - ข้อยกเว้นมาตรฐาน

  • Assertions- สิ่งนี้จะกล่าวถึงในAssertions ในบทช่วยสอนPython 3

ข้อยกเว้นมาตรฐาน

นี่คือรายการข้อยกเว้นมาตรฐานที่มีอยู่ใน Python -

ซีเนียร์ ชื่อและคำอธิบายข้อยกเว้น
1

Exception

คลาสพื้นฐานสำหรับข้อยกเว้นทั้งหมด

2

StopIteration

เพิ่มขึ้นเมื่อเมธอด next () ของตัววนซ้ำไม่ชี้ไปที่วัตถุใด ๆ

3

SystemExit

เพิ่มขึ้นโดยฟังก์ชัน sys.exit ()

4

StandardError

คลาสพื้นฐานสำหรับข้อยกเว้นในตัวทั้งหมดยกเว้น StopIteration และ SystemExit

5

ArithmeticError

คลาสฐานสำหรับข้อผิดพลาดทั้งหมดที่เกิดขึ้นสำหรับการคำนวณตัวเลข

6

OverflowError

เพิ่มขึ้นเมื่อการคำนวณเกินขีด จำกัด สูงสุดสำหรับประเภทตัวเลข

7

FloatingPointError

เพิ่มขึ้นเมื่อการคำนวณทศนิยมล้มเหลว

8

ZeroDivisonError

เพิ่มขึ้นเมื่อการหารหรือโมดูโลด้วยศูนย์เกิดขึ้นสำหรับประเภทตัวเลขทั้งหมด

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

OSError

เพิ่มขึ้นสำหรับข้อผิดพลาดที่เกี่ยวข้องกับระบบปฏิบัติการ

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

ไวยากรณ์สำหรับการยืนยันคือ -

assert Expression[, Arguments]

หากการยืนยันล้มเหลว Python จะใช้ ArgumentExpression เป็นอาร์กิวเมนต์สำหรับ AssertionError ข้อยกเว้น AssertionError สามารถจับและจัดการได้เหมือนกับข้อยกเว้นอื่น ๆ โดยใช้คำสั่ง try-except หากไม่ได้รับการจัดการจะยุติโปรแกรมและสร้างการตรวจสอบย้อนกลับ

ตัวอย่าง

นี่คือฟังก์ชันที่แปลงอุณหภูมิที่กำหนดจากองศาเคลวินเป็นองศาฟาเรนไฮต์ เนื่องจาก 0 ° K เย็นที่สุดเท่าที่จะได้รับฟังก์ชั่นนี้จะป้องกันไม่ให้อุณหภูมิติดลบ -

#!/usr/bin/python3

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-block จะดำเนินการหากโค้ดใน try: block ไม่ทำให้เกิดข้อยกเว้น

  • else-block เป็นสถานที่ที่ดีสำหรับโค้ดที่ไม่จำเป็นต้องใช้ try: block's protection

ตัวอย่าง

ตัวอย่างนี้เปิดไฟล์เขียนเนื้อหาในไฟล์และออกมาอย่างสวยงามเพราะไม่มีปัญหาเลย -

#!/usr/bin/python3

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/python3

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:บล็อก. finally:block เป็นที่สำหรับใส่โค้ดที่ต้องรันไม่ว่า try-block จะมีข้อยกเว้นหรือไม่ก็ตาม ไวยากรณ์ของคำสั่ง try-ในที่สุดคือ -

try:
   You do your operations here;
   ......................
   Due to any exception, this may be skipped.
finally:
   This would always be executed.
   ......................

Note- คุณสามารถระบุข้อยกเว้นหรืออนุประโยคสุดท้าย แต่ไม่ใช่ทั้งสองอย่าง คุณไม่สามารถใช้ประโยคอื่นร่วมกับอนุประโยคสุดท้ายได้

ตัวอย่าง

#!/usr/bin/python3

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")
   fh.close()

หากคุณไม่ได้รับอนุญาตให้เปิดไฟล์ในโหมดการเขียนสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Error: can't find file or read data

ตัวอย่างเดียวกันสามารถเขียนได้อย่างหมดจดมากขึ้นดังนี้ -

#!/usr/bin/python3

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")

สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -

Going to close the file

เมื่อเกิดข้อยกเว้นในบล็อกลองการดำเนินการจะส่งผ่านไปยังบล็อกสุดท้ายทันที หลังจากดำเนินการคำสั่งทั้งหมดในบล็อกสุดท้ายข้อยกเว้นจะถูกเพิ่มขึ้นอีกครั้งและจะถูกจัดการในคำสั่งยกเว้นหากมีอยู่ในชั้นถัดไปของคำสั่งtry-except

อาร์กิวเมนต์ของข้อยกเว้น

ข้อยกเว้นสามารถมีอาร์กิวเมนต์ซึ่งเป็นค่าที่ให้ข้อมูลเพิ่มเติมเกี่ยวกับปัญหา เนื้อหาของอาร์กิวเมนต์แตกต่างกันไปตามข้อยกเว้น คุณจับอาร์กิวเมนต์ของข้อยกเว้นโดยการจัดหาตัวแปรในข้อยกเว้นดังต่อไปนี้ -

try:
   You do your operations here
   ......................
except ExceptionType as Argument:
   You can print value of Argument here...

หากคุณเขียนโค้ดเพื่อจัดการกับข้อยกเว้นเดียวคุณสามารถมีตัวแปรตามชื่อของข้อยกเว้นในคำสั่งยกเว้น หากคุณกำลังดักจับข้อยกเว้นหลายรายการคุณสามารถมีตัวแปรตามทูเพิลของข้อยกเว้น

ตัวแปรนี้ได้รับค่าของข้อยกเว้นซึ่งส่วนใหญ่ประกอบด้วยสาเหตุของข้อยกเว้น ตัวแปรสามารถรับค่าเดียวหรือหลายค่าในรูปแบบทูเพิล ทูเปิลนี้มักประกอบด้วยสตริงข้อผิดพลาดหมายเลขข้อผิดพลาดและตำแหน่งข้อผิดพลาด

ตัวอย่าง

ต่อไปนี้เป็นตัวอย่างสำหรับข้อยกเว้นเดียว -

#!/usr/bin/python3

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError as 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 Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

Note- เพื่อที่จะจับข้อยกเว้นประโยค "ยกเว้น" ต้องอ้างถึงข้อยกเว้นเดียวกันที่โยนเป็นวัตถุคลาสหรือสตริงธรรมดา ตัวอย่างเช่นในการจับข้อยกเว้นข้างต้นเราต้องเขียนข้อยกเว้นดังนี้ -

try:
   Business Logic here...
except Exception as e:
   Exception handling here using e.args...
else:
   Rest of the code here...

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้การเพิ่มข้อยกเว้น -

#!/usr/bin/python3

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

try:
   l = functionName(-10)
   print ("level = ",l)
except Exception as e:
   print ("error in level argument",e.args[0])

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้

error in level argument -10

ข้อยกเว้นที่ผู้ใช้กำหนด

Python ยังช่วยให้คุณสร้างข้อยกเว้นของคุณเองได้โดยรับคลาสจากข้อยกเว้นในตัวมาตรฐาน

นี่คือตัวอย่างที่เกี่ยวข้องกับRuntimeerror นี่ชั้นจะถูกสร้างขึ้นที่ subclassed จากRuntimeerror สิ่งนี้มีประโยชน์เมื่อคุณต้องการแสดงข้อมูลที่เฉพาะเจาะจงมากขึ้นเมื่อพบข้อยกเว้น

ในบล็อก try ข้อยกเว้นที่ผู้ใช้กำหนดจะถูกยกขึ้นและถูกจับในบล็อกยกเว้น ตัวแปรอีใช้ในการสร้างอินสแตนซ์ของระดับชั้นNetworkerror

class Networkerror(RuntimeError):
   def __init__(self, arg):
      self.args = arg

ดังนั้นเมื่อคุณกำหนดคลาสข้างต้นแล้วคุณสามารถเพิ่มข้อยกเว้นได้ดังนี้ -

try:
   raise Networkerror("Bad hostname")
except Networkerror,e:
   print e.args