簡體   English   中英

Python:為什么退出后仍會調用except

[英]Python: why except is called even after exit

請檢查以下代碼,

import sys
try:
    seq=eval(raw_input("Enter seq number: "))
    if seq <= 0 or seq >= 9999:
       print "Sequence number not in range [0001-9999]"
       sys.exit(1)
except:
      print "!!! Sequence number not in range [0001-9999]"
      sys.exit(1)

我給eval raw_input函數提供了一個字符串。

$> python test.py
Enter seq number: "12"


Sequence number not in range [0001-9999]
!!! Sequence number not in range [0001-9999]

為什么即使接到exit呼叫后仍不退出?

sys.exit只會引發一個異常( SystemExit ),然后將其捕獲。 作為演示:

import sys
import traceback

try:
    sys.exit(1)
except:
    print "This threw the following exception:"
    traceback.print_exc()
# This threw the following exception:
# Traceback (most recent call last):
#   File "test.py", line 5, in <module>
#     sys.exit(1)
# SystemExit: 1

sys.exit引發SystemExit異常,該異常由未命名的異常處理程序捕獲

注意,在此處具有通用異常處理程序通常不是一個好主意。

為了避免使用您的通用異常處理程序捕獲SystemExit ,請添加另一個異常處理程序以處理您的SystemExit

>>> try:
    seq=eval(raw_input("Enter seq number: "))
    if seq <= 0 or seq >= 9999:
       print "Sequence number not in range [0001-9999]"
       sys.exit(1)
except SystemExit:
    pass
except Exception:
      print "!!! Sequence number not in range [0001-9999]"
      sys.exit(1)

這是一個絕妙的案例,為什么您不應該使用裸機。 無效的數字是ValueErrors,因此:

import sys
try:
    seq = int(raw_input("Enter seq number: "))
    if seq <= 0 or seq >= 9999:
       raise ValueError('sequence number not in range [0001-9999]')
except ValueError as e:
    print e
    sys.exit(1)

輸出:

C:\>test
Enter seq number: 10000
sequence number not in range [0001-9999]

C:\>test
Enter seq number: abc
invalid literal for int() with base 10: 'abc'

C:\>test
Enter seq number: 5

注意, eval也不適用,因為它將執行任何用戶類型的操作,例如import shutil; shutil.rmtree('/') import shutil; shutil.rmtree('/')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM