[英]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.