在Python中无法中止(ctrl+;c)
我写这段代码是为了在输入不是整数的情况下不断请求更多的输入。但是,当我在python交互会话中尝试中止它时,它会不断请求输入 为什么它会这样做,即使我按下Ctrl+C,这意味着中止在Python中无法中止(ctrl+;c),python,python-3.x,exception,exception-handling,keyboardinterrupt,Python,Python 3.x,Exception,Exception Handling,Keyboardinterrupt,我写这段代码是为了在输入不是整数的情况下不断请求更多的输入。但是,当我在python交互会话中尝试中止它时,它会不断请求输入 为什么它会这样做,即使我按下Ctrl+C,这意味着中止 def get_size(text): while True: try: i = int(input(text)) if i >= 0 and i<24: break except:
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: ")
def get_大小(文本):
尽管如此:
尝试:
i=int(输入(文本))
如果i>=0且iCtrl+C表示键盘中断
,但您的除外
块捕捉并忽略它(以及所有其他异常)。在我看来,即使是Ctrl+D也不会停止执行,所以你应该终止这个进程。Ctrl+C意味着键盘中断,但是你的块会捕获并忽略它(以及所有其他异常)。在我看来,即使Ctrl+D也不会停止执行,所以你应该终止进程。你让尝试:
,除了:
在内阻塞而
循环。因此,每当脚本抛出错误时,except
只是在循环时传递并返回到。您让尝试:
except:
块在循环中。因此,每当脚本抛出错误时,除了
之外的
只是在
循环时传递并返回到。当您按下Ctrl+C时,Python解释器捕捉到中断并抛出一个键盘中断
异常。因为您的裸except
相当于except BaseException
,KeyboardInterrupt
是BaseException
的子类,所以您的except
将捕获键盘中断。在块中没有异常处理(如重新提升),除了
块,因此程序将继续
至少将Exception
更改为Exception
,因为属于BaseException
子类但不属于Exception
子类的异常(KeyboardInterrupt
、SystemExit
和GeneratorExit
)实际上并不意味着被吞没。在一些罕见的情况下,在重新饲养它们之前,抓住它们并进行清理是有意义的。但是,几乎没有一个用例可以用来捕捉它们,并且不再饲养它们
这可能很方便:
您可能会注意到,Exception
还可以捕获一些您可能无法恢复的异常。例如,MemoryError
、SyntaxError
或SystemError
通常表示出现了(真正的)错误,不应接受这些错误,因为它们可能无法“恢复”(至少在大多数情况下)
这意味着您应该观察代码可能引发哪些异常,以及在哪些情况下,然后决定可以从哪些异常中恢复
就你而言:
input()
不应该失败,因此您不妨将其置于try
之外李>
- 类似地,您也不会期望比较失败,因此也可以将它们放在
try
块之外。因为您只希望在try
成功的情况下运行该代码,所以您需要保护它,例如在try
的else
块中李>
int()
可能会失败,因为类型错误
是不受支持的类型,但是输入总是返回字符串。String是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
你用哪一个主要取决于你的喜好。两者的工作原理应该相同
总结一下:
- 确定允许失败的最小代码量(从您的角度来看),不要在
try
块中放入任何其他内容
- 确保只捕获“可恢复”异常。在大多数情况下,异常类型就足够了。但有时也可以检查异常消息,以确保它确实是您想要捕获的异常
- 切勿使用
except:
或except:BaseException:
。唯一的例外是,如果您确实想捕获SystemExit
、键盘中断
或GeneratorExit
,并知道如何正确处理它们。除了异常之外,您可能会侥幸逃脱,但是对于任何您想要经常使用的代码(或生产代码),您应该投入时间来查找更合适的异常
当按下Ctrl+C时,Python解释器捕捉到中断并抛出一个键盘中断
异常。因为您的裸except
相当于except BaseException
,KeyboardInterrupt
是BaseException
的子类,所以您的except
将捕获键盘中断。在块中没有异常处理(如重新提升),除了
块,因此程序将继续
至少将Exception
更改为Exception
,因为属于BaseException
子类但不属于Exception
子类的异常(KeyboardInterrupt
、SystemExit
和GeneratorExit
)实际上并不意味着被吞没。在一些罕见的情况下,在重新饲养它们之前,抓住它们并进行清理是有意义的。但是,几乎没有一个用例可以用来捕捉它们,并且不再饲养它们
这可能很方便:
您可能会注意到,Exception
还可以捕获一些您可能无法恢复的异常。例如内存错误
,语法错误
,或系统错误
正常
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
def get_size(text):
while True:
input_text = input(text)
try:
i = int(input_text)
except ValueError:
continue
if 0 <= i < 24:
return i