1

请检查以下代码,

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

4

3 回答 3

8

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
于 2013-01-28T18:18:37.313 回答
3

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)
于 2013-01-28T18:19:21.893 回答
1

这是一个很好的例子,为什么你永远不应该使用裸的 except。无效数字是 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

Noteeval也不受欢迎,因为它会执行用户输入的任何内容,例如import shutil; shutil.rmtree('/').

于 2013-01-28T18:27:21.067 回答