如果输入的不是整数,我编写此代码是为了不断要求更多的输入。但是,当我尝试在python交互式会话中中止它时,它一直要求输入。
即使我按Ctrl + C,这也为什么会这样做?
def get_size(text):
while True:
try:
i = int(input(text))
if i >= 0 and i<24:
break
except:
pass
return i
a = get_size("Input: ")
答案 0 :(得分:2)
当您按下 Ctrl + C 时,Python解释器捕获中断并引发KeyboardInterrupt
异常。因为裸露的except
等效于except BaseException
,并且KeyboardInterrupt
是BaseException
的子类,所以except
将捕获KeyboardInterrupt
。 except
块中没有异常处理(例如重新引发),因此程序将继续。
至少将except
更改为except Exception
,因为属于BaseException
子类但不属于Exception
(KeyboardInterrupt
子类的异常, SystemExit
和GeneratorExit
)并不是真的要被吞下。在极少数情况下,在重新饲养它们之前将它们捕获并进行一些清理是很有意义的。但是,几乎没有用例可以捕获它们,而不必再次提出它们。
可能方便的Python documentation actually contains a hierarchy visualization of built-in exceptions:
BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StopAsyncIteration +-- ArithmeticError | +-- FloatingPointError | +-- OverflowError | +-- ZeroDivisionError +-- AssertionError +-- AttributeError +-- BufferError +-- EOFError +-- ImportError | +-- ModuleNotFoundError +-- LookupError | +-- IndexError | +-- KeyError +-- MemoryError ...
您可能会注意到except Exception
可以还会捕获一些您可能无法恢复的异常。例如MemoryError
,SyntaxError
或SystemError
通常表示某事出了错(真的),并且不应吞下这些东西,因为这些 可能是“不可恢复的” ”(至少在大多数情况下)。
这意味着您应该观察代码可能会引发哪些异常以及在何种情况下引发异常,然后确定可以从哪些异常中恢复。
在您的情况下:
input()
并非应该失败,因此您最好将其放在try
之外。 try
块之外。因为您只希望代码在try
成功之后才能运行,所以您需要对其进行保护,例如在else
的{{1}}块中。 try
是不受支持的类型,则可能由于int()
而失败,但是TypeError
总是返回字符串。字符串是input
可接受的类型,因此不会想到会发生这种情况。int()
。如果无法将字符串解释为整数,则会引发该错误。所以我会用:
ValueError
或者,如果您不想使用def get_size(text):
while True:
input_text = input(text)
try:
i = int(input_text)
except ValueError:
pass
else:
if 0 <= i < 24:
return i
块,也可以在else
块中使用continue
:
except
您使用的哪一个主要取决于偏好。两者应该工作相同。
总结一下:
def get_size(text):
while True:
input_text = input(text)
try:
i = int(input_text)
except ValueError:
continue
if 0 <= i < 24:
return i
块中放入其他任何内容。try
或except:
。唯一的例外是,如果您确实想抓住except BaseException:
,SystemExit
或KeyboardInterrupt
并知道如何适当处理它们。您可能会放弃使用GeneratorExit
,但是对于要定期使用的任何代码(或在生产代码中使用的代码),您应该花时间寻找更合适的异常。答案 1 :(得分:1)
Ctrl + C的意思是KeyboardInterrupt
,但是您的except
块会捕获并忽略它(以及所有其他异常)。甚至Ctrl + D也不会停止执行,所以我认为您应该终止该过程。
答案 2 :(得分:0)
您在try:
循环内创建了except:
while
块。因此,每当脚本抛出错误时,except
就会通过并返回到while
循环。