我正在使用Windows(via this PDCurses)上的curses模块,尝试打破KeyboardInterrupt异常,但是按ctrl + c时不会引发异常。

一些简化的代码:

from curses import wrapper
items = ['a', 'very', 'long', 'list', 'of', 'strings']

def main(screen):
    for item in items:
        screen.addstr(0, 0, item)
        screen.getch()
        screen.refresh()

wrapper(main)


items列表很长,现在我无法中途停止执行。我只需要反复按按键,直到结束。天堂禁止我在while True:中尝试!

当我按ctrl + c时,不会引发任何异常。它确实以getch()的形式传递给我的3。是在getch收到3时手动提高SOP,还是有一种更适当的方法来避免吞下KeyboardInterrupt

最佳答案

默认情况下,curses使用raw模式,该模式可从文档中关闭中断/退出/挂起等功能。


  在原始模式下,正常的行缓冲和中断,退出,
  挂起,并关闭流控制键;字符是
  呈现给诅咒输入功能一个接一个


从C的诅咒documentation


  这两个函数(rawcbreak)之间的区别在于
  控制字符(如暂停(CTRL-Z),中断和退出)的方式
  (CTRL-C)传递给程序。在raw()模式下,这些
  字符直接传递给程序,而不会产生
  信号。


由于python在发送KeyboardInterrupt时会引发SIGINT,因此可以预料到它不会被引发。您看到的3确实表示一个中断。

由于这是C库处理的事情,因此无法避免这种“吞噬”异常。但是,您可以为getch使用简单的包装器,以检查其何时返回3并相应地引发错误。

关于python - 内部诅咒时如何提高KeyboardInterrupt,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21123146/

10-09 02:49