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