Python ลอง ... ยกเว้นเครื่องหมายคอมม่าและ 'เหมือน' ในยกเว้น


246

อะไรคือความแตกต่างระหว่าง ',' และ 'เป็น' ในยกเว้นข้อความเช่น:

try:
    pass
except Exception, exception:
    pass

และ:

try:
    pass
except Exception as exception:
    pass

ไวยากรณ์ที่สองถูกต้องตามกฎหมายใน 2.6 หรือไม่ มันทำงานได้ใน CPython 2.6 บน Windows แต่ล่าม 2.5 ใน cygwin บ่นว่ามันไม่ถูกต้อง

หากทั้งคู่ใช้ได้ใน 2.6 ฉันควรใช้อะไร?

คำตอบ:


284

เอกสารที่ชัดเจนคือPEP-3110: การตรวจจับข้อยกเว้น

สรุป:

  • ในหลาม 3.x ใช้asถูกต้องในการกำหนดข้อยกเว้นให้กับตัวแปร
  • ใน Python 2.6+ ให้ใช้asไวยากรณ์เนื่องจากมันมีความคลุมเครือน้อยกว่าและเข้ากันได้กับ Python 3.x
  • ใน Python 2.5 และรุ่นก่อนหน้าให้ใช้รุ่นจุลภาคเนื่องจากasไม่รองรับ

16
การใช้asเป็นวิธีเดียวที่จะกำหนดข้อยกเว้นให้กับโลคัลใน Python 3.x แต่asไม่จำเป็นเนื่องจากคุณไม่จำเป็นต้องระบุหากคุณไม่ต้องการเลย
mercator

38

ใช่มันถูกกฎหมาย ฉันกำลังใช้ Python 2.6

try:
    [] + 3
except Exception as x:
    print "woo hoo"

>>> 
woo hoo

อัปเดต : มีเหตุผลอื่นที่จะใช้asไวยากรณ์ การใช้,ทำให้สิ่งต่าง ๆ มีความคลุมเครือมากกว่าอย่างที่คนอื่น ๆ ชี้ให้เห็น และนี่คือสิ่งที่สร้างความแตกต่าง ตั้งแต่ Python 2.6 multicatchคุณสามารถรับข้อยกเว้นหลาย ๆ ตัวได้ในexceptบล็อกเดียว ในสถานการณ์เช่นนี้มันแสดงออกและไพเราะมากขึ้นที่จะพูด

except (exception1, exception2) as e

มากกว่าที่จะพูด

except (exception1, exception2), e

ซึ่งยังคงใช้งานได้


13
Python เวอร์ชันก่อนหน้า 2.6 อนุญาตให้คุณใช้ tuple เพื่อตรวจจับข้อยกเว้นหลายประเภท แต่ไวยากรณ์สับสน คุณจะใช้except NameError, ValueError:แล้วสงสัยว่าทำไมValueErrorข้อยกเว้นไม่เคยถูกจับ หรือใช้except (NameError, e):และถูกทิ้งไว้ด้วยNameErrorเพื่อ'e'!
Martijn Pieters

17

ไวยากรณ์ "as" เป็นสิ่งที่ต้องการในอนาคตหากรหัสของคุณจำเป็นต้องใช้กับ Python เวอร์ชั่นเก่า (2.6 เป็นรุ่นแรกที่รองรับใหม่) คุณจะต้องใช้ไวยากรณ์ของคอมม่า


9

หากคุณต้องการสนับสนุนทุกรุ่นของหลามคุณสามารถใช้sys.exc_info()ฟังก์ชั่นดังนี้:

try:
    a = 1/'0'
except (ZeroDivisionError, TypeError):
    e = sys.exc_info()[1]
    print(e.args[0])

(ที่มา: http://python3porting.com/noconv.html )


2
หมายเหตุ: มีบางกรณีที่มุมที่นี่ที่ต้องระวัง ใน Py3 asเป้าหมาย (รวมถึงข้อมูลส่วนที่เหลือทั้งหมด) จะถูกสร้างขึ้นdelทันทีที่คุณออกจากexceptบล็อก (ซึ่งจะเป็นการป้องกันการอ้างอิงแบบวนรอบที่เกี่ยวข้องกับการติดตามย้อนกลับที่เก็บไว้จากการหน่วงเวลาการปล่อยหน่วยความจำจนกระทั่ง cyclic GC ) ดังนั้นรหัสที่เทียบเท่านี้จะเทียบเท่ากันน้อยกว่าเล็กน้อยเว้นแต่คุณจะใช้ a try/finallyภายในexceptบล็อกเพื่อให้แน่ใจว่าdel eมีการดำเนินการก่อนที่จะออกจากexceptบล็อก
ShadowRanger

0

ในฐานะของ Python 3.7 (ไม่แน่ใจเกี่ยวกับเวอร์ชันอื่น) ไวยากรณ์ 'เครื่องหมายจุลภาค' ไม่รองรับอีกต่อไป:

ไฟล์ต้นฉบับexception_comma.py:

try:
    result = 1/0
except Exception, e:
    print("An error occurred")
    exit(1)

exit(0)
  • $ python --version --> Python 2.7.10
$ python exception_comma.py
An error occurred
  • $ python3 --version --> Python 3.7.2
$ python3 exception_comma.py
  File "exception_comma.py", line 3
    except Exception, e:
                    ^
SyntaxError: invalid syntax
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.