Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中无法中止(ctrl+;c)_Python_Python 3.x_Exception_Exception Handling_Keyboardinterrupt - Fatal编程技术网

在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:

我写这段代码是为了在输入不是整数的情况下不断请求更多的输入。但是,当我在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: ")
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