Пожалуйста, проверьте приведенный ниже код,

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?

1
Dinesh 28 Янв 2013 в 22:17

3 ответа

Лучший ответ

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
8
David Robinson 28 Янв 2013 в 18:24

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)
3
Abhijit 28 Янв 2013 в 18:19

Это отличный случай, почему вы никогда не должны использовать голые, кроме. Недопустимые числа - это 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('/').

1
Mark Tolonen 29 Янв 2013 в 23:21