การจัดการข้อยกเว้นงูหลาม
งูหลามมีสองฟังก์ชั่นสำคัญมากที่จะจัดการกับข้อยกเว้นและข้อผิดพลาดโปรแกรมหลามที่ปรากฏในการดำเนินงาน คุณสามารถใช้คุณลักษณะนี้เพื่อแก้ปัญหาโปรแกรมหลาม
- การจัดการข้อยกเว้น: งูหลามเว็บไซต์กวดวิชารายละเอียดที่เฉพาะเจาะจง
- ยืนยัน (ยืนยัน): กวดวิชาเว็บไซต์หลามรายละเอียดที่เฉพาะเจาะจง
ข้อยกเว้นหลามมาตรฐาน
ชื่อข้อยกเว้น | ลักษณะ |
---|---|
BaseException | ฐานชั้นเรียนสำหรับข้อยกเว้นทั้งหมด |
SystemExit | คำขอล่ามเพื่อออกจาก |
KeyboardInterrupt | ผู้ใช้ขัดจังหวะการดำเนินการ (ปกติใส่ ^ C) |
ข้อยกเว้น | ข้อผิดพลาดทั่วไปชั้นฐาน |
StopIteration | iterator ไม่มีค่ามากขึ้น |
GeneratorExit | เครื่องกำเนิดไฟฟ้า (กำเนิด) เพื่อแจ้งให้ทางออกที่ผิดปกติ |
StandardError | ทุกตัวในชั้นฐานมาตรฐานสำหรับข้อยกเว้น |
ArithmeticError | ทั้งหมดตัวเลขชั้นฐานข้อผิดพลาด |
FloatingPointError | ข้อผิดพลาดในการคำนวณจุดลอยตัว |
OverflowError | การดำเนินงานเชิงตัวเลขเกินขีด จำกัด สูงสุด |
ZeroDivisionError | นอกเหนือไป (หรือโมดูลัส) ศูนย์ (ทุกประเภทข้อมูล) |
AssertionError | ความล้มเหลวในการยืนยัน |
AttributeError | วัตถุนี้มีคุณสมบัติไม่ |
EOFError | ไม่มีตัวในการป้อนข้อมูลและมาถึงเครื่องหมาย EOF |
EnvironmentError | ปฏิบัติการชั้นฐานผิดพลาดของระบบ |
IOError | การดำเนินงาน Input / Output ที่จะล้มเหลว |
OSError | ข้อผิดพลาดของระบบปฏิบัติการ |
WindowsError | สายระบบล้มเหลว |
ImportError | นำเข้า / โมดูลวัตถุล้มเหลว |
LookupError | ระดับที่ไม่ถูกต้องคำสั่งฐานข้อมูล |
IndexError | โดยไม่ต้องดัชนีลำดับนี้ (ดัชนี) |
KeyError | โดยไม่ต้องคีย์การแมปนี้ |
MemoryError | ข้อผิดพลาดของหน่วยความจำล้น (สำหรับงูหลามล่ามจะไม่ร้ายแรง) |
NameError | ประกาศ / เริ่มต้นวัตถุ (ไม่ได้ทรัพย์สิน) |
UnboundLocalError | การเข้าถึงตัวแปรท้องถิ่นเตรียม |
ReferenceError | วัตถุอ้างอิงอ่อนแอ (อ้างอิงที่อ่อนแอ) ได้พยายามที่จะเข้าถึงการเก็บขยะของ |
Runtimeerror | ข้อผิดพลาด runtime ทั่วไป |
NotImplementedError | วิธีการที่ยังไม่ได้รับการดำเนินการ |
SyntaxError | งูหลามไวยากรณ์ผิดพลาด |
IndentationError | ข้อผิดพลาดเยื้อง |
TabError | แท็บและพื้นที่ผสม |
SystemError | ผิดพลาดของระบบล่ามโดยปกติ |
TypeError | ประเภทการดำเนินงานที่ไม่ถูกต้อง |
ValueError | ข้อโต้แย้งที่ไม่ถูกต้องผ่านใน |
UnicodeError | ข้อผิดพลาดที่เกี่ยวข้องกับ Unicode |
UnicodeDecodeError | ถอดรหัส Unicode ของข้อผิดพลาด |
UnicodeEncodeError | รหัสข้อผิดพลาด Unicode |
UnicodeTranslateError | ข้อผิดพลาดการแปลง Unicode |
การเตือน | คำเตือนชั้นฐาน |
DeprecationWarning | คำเตือนเกี่ยวกับคุณลักษณะเลิก |
FutureWarning | คำเตือนเกี่ยวกับโครงสร้างในอนาคตของความหมายที่มีการเปลี่ยนแปลง |
OverflowWarning | คำเตือนเกี่ยวกับการเลื่อนตำแหน่งเก่าโดยอัตโนมัติเพื่อให้เป็นจำนวนเต็มยาว (Long) ของ |
PendingDeprecationWarning | มันจะเป็นคำเตือนเกี่ยวกับลักษณะของเสีย |
RuntimeWarning | พฤติกรรมที่น่าสงสัย Runtime (Runtime พฤติกรรม) เตือน |
SyntaxWarning | คำเตือนไวยากรณ์ที่น่าสงสัย |
UserWarning | เตือนผู้ใช้รหัสรุ่น |
อะไรคือสิ่งที่ผิดปกติ?
ยกเว้นว่าเป็นเหตุการณ์ที่จะเกิดขึ้นระหว่างการทำงานของโปรแกรมที่มีผลต่อการทำงานของโปรแกรมปกติ
ภายใต้สถานการณ์ปกติเมื่อโปรแกรมหลามไม่ต้องจัดการข้อยกเว้นเกิดขึ้น
ยกเว้นเป็นวัตถุหลามเป็นตัวแทนของความผิดพลาด
ข้อยกเว้นเกิดขึ้นเมื่อสคริปต์ Python ที่เราต้องจัดการกับมันจับมิฉะนั้นโปรแกรมจะถูกยกเลิก
การจัดการข้อยกเว้น
คุณสามารถจับข้อยกเว้นใช้ลอง / ยกเว้นคำสั่ง
ลอง / ยกเว้นคำสั่งที่ใช้ในการตรวจสอบข้อผิดพลาดในบล็อกลองเพื่อให้ยกเว้นคำสั่งที่จะจับข้อยกเว้นและการประมวลผลข้อมูล
หากคุณไม่ต้องการให้มีการยกเว้นเกิดขึ้นเมื่อปลายของโปรแกรมของคุณเพียงแค่พยายามที่จะจับมันอยู่ในภายใน
ไวยากรณ์:
ต่อไปนี้เป็นที่เรียบง่ายลอง .... ยกเว้น ... ไวยากรณ์อื่น:
try: <语句> #运行别的代码 except <名字>: <语句> #如果在try部份引发了'name'异常 except <名字>,<数据>: <语句> #如果引发了'name'异常,获得附加的数据 else: <语句> #如果没有异常发生
พยายามทำงานเมื่อเริ่มต้นลองคำสั่งคืองูหลามจะถูกทำเครื่องหมายในบริบทของโปรแกรมปัจจุบันเพื่อที่ว่าเมื่อมีความผิดปกติเกิดขึ้นสามารถที่จะกลับมาที่นี่ลองประโยคแรกที่จะดำเนินการสิ่งที่เกิดขึ้นต่อไปขึ้นอยู่กับการดำเนินการ ไม่ว่าจะมีข้อยกเว้น
- หากมีข้อยกเว้นเกิดขึ้นเมื่อคุณพยายามที่จะดำเนินการเมื่อคำสั่งหลังจากหลามข้ามไปและพยายามดำเนินการจับคู่ครั้งแรกข้อยกเว้นเป็นข้อยกเว้นในการประมวลผลข้อยกเว้นเสร็จสิ้นการควบคุมการไหลผ่านงบลองทั้งหมด (เวลาเว้นแต่จะมีการประมวลผลและเรียกใหม่ ข้อยกเว้น)
- หากมีความผิดปกติเกิดขึ้นในงบลองหลังจากปีที่ผ่านมา แต่การจับคู่ไม่มีข้อยกเว้นข้อยกเว้นจะถูกส่งไปยังด้านบนของลองหรือยังด้านบนของโปรแกรม (ซึ่งจะสิ้นสุดของโปรแกรมและพิมพ์ข้อความข้อผิดพลาดเริ่มต้น)
- หากข้อยกเว้นเกิดขึ้นเมื่อคุณพยายามประโยคจะไม่ทำงาน, Python อื่นคำสั่งจะถูกดำเนินการหลังจากคำสั่ง (ถ้าแล้วอื่น) แล้วการไหลของการควบคุมผ่านลองคำสั่งทั้งหมด
ตัวอย่าง
นี่เป็นตัวอย่างง่ายๆก็เปิดแฟ้มเนื้อหาของเนื้อหาของไฟล์ที่เป็นลายลักษณ์อักษรและไม่ได้เป็นข้อยกเว้นเกิดขึ้น:
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close()
เอาท์พุทโปรแกรมข้างต้น:
$ python test.py 内容写入文件成功 $ cat testfile # 查看写入的内容 这是一个测试文件,用于测试异常!!
ตัวอย่าง
นี่เป็นตัวอย่างง่ายๆก็เปิดแฟ้มเนื้อหาที่เขียนในเนื้อหาของแฟ้ม แต่ไฟล์ไม่ได้มีสิทธิ์ในการเขียนข้อยกเว้นที่เกิดขึ้น:
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close()
ก่อนที่จะดำเนินรหัสเพื่อความสะดวกในการทดสอบครั้งแรกที่เราสามารถเอาสิทธิ์ในการเขียนไปยังแฟ้ม testfile คำสั่งดังต่อไปนี้:
chmod -w testfile
แล้วรันโค้ดข้างต้น:
$ python test.py Error: 没有找到文件或读取文件失败
ได้รับการยกเว้นไม่ต้องใช้วิธีใดวิธีหนึ่งข้อยกเว้นด้วย
คุณสามารถใช้โดยไม่ต้องพิมพ์ข้อยกเว้นใด ๆ ยกเว้นตัวอย่างต่อไปนี้:
try: 正常的操作 ...................... except: 发生异常,执行这块代码 ...................... else: 如果没有异常执行这块代码
ดังกล่าวข้างต้นลักษณะลองยกเว้นคำสั่งให้จับข้อยกเว้นทั้งหมดที่เกิดขึ้น แต่นี้ไม่ได้เป็นวิธีที่ดีผ่านโปรแกรมนี้เราไม่สามารถระบุข้อมูลที่ยกเว้นที่เฉพาะเจาะจง เพราะมันจับข้อยกเว้นทั้งหมด
และมีการใช้หลายประเภทของข้อยกเว้นยกเว้น
นอกจากนี้คุณยังสามารถใช้เดียวกันยกเว้นงบในการจัดการข้อยกเว้นหลายดังนี้
try: 正常的操作 ...................... except(Exception1[, Exception2[,...ExceptionN]]]): 发生以上多个异常中的一个,执行这块代码 ...................... else: 如果没有异常执行这块代码
ลองในที่สุดคำสั่ง
ลองคำสั่งในที่สุดไม่ว่าจะเป็นข้อยกเว้นเกิดขึ้นจะดำเนินการรหัสสุดท้าย
try: <语句> finally: <语句> #退出try时总会执行 raise
ตัวอย่าง
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") finally: print "Error: 没有找到文件或读取文件失败"
ถ้าคุณเปิดไฟล์ไม่ได้เขียนได้รับอนุญาตออกเป็นดังนี้:
$ python test.py Error: 没有找到文件或读取文件失败
ตัวอย่างเดียวกันยังสามารถเขียนได้ดังนี้
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") try: fh.write("这是一个测试文件,用于测试异常!!") finally: print "关闭文件" fh.close() except IOError: print "Error: 没有找到文件或读取文件失败"
เมื่อโยนข้อยกเว้นในลองบล็อก, บล็อกสุดท้ายของรหัสทันที
บล็อกสุดท้ายงบทั้งหมดหลังจากการดำเนินการยกเว้นจะถูกเรียกอีกครั้งและการดำเนินการยกเว้นการป้องกันรหัส
เนื้อหาของพารามิเตอร์จะแตกต่างจากข้อยกเว้น
พารามิเตอร์ที่ผิดปกติ
มีข้อยกเว้นที่สามารถใช้พารามิเตอร์เป็นพารามิเตอร์ที่ส่งออกข้อมูลความผิดปกติ
คุณสามารถจับยกเว้นผ่านงบพารามิเตอร์ยกเว้นดังต่อไปนี้:
try: 正常的操作 ...................... except ExceptionType, Argument: 你可以在这输出 Argument 的值...
ตัวแปรค่าผิดปกติมักจะรวมอยู่ในคำสั่งที่ได้รับการยกเว้น ตัวแปรในรูปแบบของ tuples อาจได้รับหนึ่งหรือมากกว่าค่า
tuple มักจะมีข้อผิดพลาดสตริงจำนวนผิดตำแหน่งที่ผิด
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างของข้อยกเว้นเดียว:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 定义函数 def temp_convert(var): try: return int(var) except ValueError, Argument: print "参数没有包含数字\n", Argument # 调用函数 temp_convert("xyz");
ผลของวิธีการดังกล่าวข้างต้นมีดังนี้
$ python test.py 参数没有包含数字 invalid literal for int() with base 10: 'xyz'
ทริกเกอร์ที่ผิดปกติ
เราสามารถใช้คำสั่งที่จะยกระดับตัวเองเรียกข้อยกเว้น
ไวยากรณ์เพิ่มเป็นดังนี้:
raise [Exception [, args [, traceback]]]
คำสั่งยกเว้นเป็นชนิดของข้อยกเว้น (ตัวอย่างเช่น NameError) พารามิเตอร์เป็นค่าพารามิเตอร์ที่ผิดปกติ พารามิเตอร์นี้หรือไม่ถ้าไม่ได้ให้การโต้แย้งข้อยกเว้นคือ "ไม่มี"
อาร์กิวเมนต์สุดท้ายคือตัวเลือก (ที่ไม่ค่อยได้ใช้ในการปฏิบัติ) ถ้ามีวัตถุร่องรอยข้อยกเว้น
ตัวอย่าง
ข้อยกเว้นอาจจะเป็นสตริงชั้นเรียนหรือวัตถุ ยกเว้น ธ ให้โดยเคอร์เนลกรณีส่วนใหญ่เป็นของชั้นเรียนซึ่งเป็นพารามิเตอร์ของอินสแตนซ์ของชั้นเกรด A
นิยามง่ายมากของข้อยกเว้นดังต่อไปนี้:
def functionName( level ): if level < 1: raise Exception("Invalid level!", level) # 触发异常后,后面的代码就不会再执行
หมายเหตุ: เพื่อให้สามารถที่จะจับข้อยกเว้น "ยกเว้น" คำสั่งจะต้องเป็นประโยชน์ในการโยนวัตถุชั้นยกเว้นเดียวกันหรือสตริง
ตัวอย่างเช่นเราจับกว่าข้อยกเว้น "ยกเว้น" คำสั่งดังต่อไปนี้:
try: 正常逻辑 except "Invalid level!": 触发自定义异常 else: 其余代码
ตัวอย่าง
#!/usr/bin/python # -*- coding: UTF-8 -*- # 定义函数 def mye( level ): if level < 1: raise Exception("Invalid level!", level) # 触发异常后,后面的代码就不会再执行 try: mye(0) // 触发异常 except "Invalid level!": print 1 else: print 2
การดำเนินงานของโค้ดข้างต้นผลลัพธ์คือ:
$ python test.py Traceback (most recent call last): File "test.py", line 11, in <module> mye(0) File "test.py", line 7, in mye raise Exception("Invalid level!", level) Exception: ('Invalid level!', 0)
ข้อยกเว้นที่ผู้ใช้กำหนด
โดยการสร้างชั้นยกเว้นใหม่โปรแกรมอาจมีข้อยกเว้นชื่อของตัวเอง ข้อยกเว้นทั่วไปควรได้รับการสืบทอดมาจากคลาสข้อยกเว้นไม่ว่าโดยตรงหรือโดยอ้อม
ต่อไปนี้เป็นตัวอย่างที่เกี่ยวข้องกับอินสแตนซ์ Runtimeerror สร้างชั้นชั้นฐานเป็น Runtimeerror สำหรับการแสดงผลข้อมูลเพิ่มเติมเมื่อมีข้อยกเว้นจะถูกเรียก
ในบล็อกลองที่ผู้ใช้ดำเนินการคำสั่งบล็อกยกเว้นข้อยกเว้นที่กำหนดเองตัวแปร E ใช้ในการสร้างอินสแตนซ์ระดับ Networkerror
class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg
หลังจากที่คุณกำหนดประเภทข้างต้นคุณสามารถเรียกข้อยกเว้นดังต่อไปนี้:
try: raise Networkerror("Bad hostname") except Networkerror,e: print e.args