Latest web development tutorials

การจัดการข้อยกเว้นงูหลาม

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

  • การจัดการข้อยกเว้น: งูหลามเว็บไซต์กวดวิชารายละเอียดที่เฉพาะเจาะจง
  • ยืนยัน (ยืนยัน): กวดวิชาเว็บไซต์หลามรายละเอียดที่เฉพาะเจาะจง

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

ชื่อข้อยกเว้น ลักษณะ
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