按下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内置的全局异常钩子,当程序出现未被捕获的异常时,解释器会自动调用这个函数,且固定传入三个参数:
- 异常类型(比如
KeyboardInterrupt类本身) - 异常实例对象(也就是触发的异常的具体实例)
- 异常回溯栈对象
你自定义了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
相关产品推荐
相关产品推荐

