You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按下CTRL+C触发TypeError: end must be None or a string, not KeyboardInterrupt的原因

相关代码
import sys
def erroring(a,b,c):
  print(end=b)
sys.excepthook = erroring
while 1:pass
错误产生原因

sys.excepthook 是Python内置的全局异常钩子,当程序出现未被捕获的异常时,解释器会自动调用这个函数,且固定传入三个参数:

  1. 异常类型(比如KeyboardInterrupt类本身)
  2. 异常实例对象(也就是触发的异常的具体实例)
  3. 异常回溯栈对象

你自定义了erroring函数并赋值给sys.excepthook,替换了默认的异常处理逻辑,当你按下CTRL+C触发KeyboardInterrupt异常且没有被捕获时,解释器就会把上述三个参数传入erroring执行:

  • 参数a接收的是KeyboardInterrupt的类
  • 参数b接收的是KeyboardInterrupt的实例对象
  • 参数c接收的是回溯栈对象

而你的erroring函数内直接执行print(end=b),print方法的end参数要求必须是字符串或者None,你传入的b是KeyboardInterrupt类的实例,不符合参数类型要求,因此就抛出了对应的TypeError。

完整触发流程
  • 程序进入while 1:pass死循环运行
  • 按下CTRL+C触发KeyboardInterrupt异常,当前没有对应的异常捕获逻辑
  • 解释器调用自定义的sys.excepthook即erroring函数,传入三个固定参数
  • print(end=b)执行时参数类型不匹配,抛出新的类型错误

内容的提问来源于stack exchange,提问作者Fmbalbuena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:45:05