#python #runtime-error #keyboardinterrupt
Вопрос:
если я нажму 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
Комментарии:
1.
b
является объектом исключения, который нельзя использовать в качествеend=
аргументаprint()
.
Ответ №1:
sys.excepthook
должна быть функция, которая принимает три аргумента: тип, сам объект исключения и обратную трассировку.
Как сказал Джон Гордон в комментариях b
, второй аргумент будет содержать само исключение. Причина , по которой он говорит TypeError: end must be None or a string, not KeyboardInterrupt
, заключается в том, что есть ошибка типа, потому end
что должно быть None
или введите str
, и вы даете ему KeyboardInterrupt
. Это помогает прочитать исключения, потому что они обычно сообщают вам о проблеме.
Я хотел бы подробнее остановиться на его комментарии, хотя в противном случае не было бы смысла публиковать ответ — вы, как правило, не должны его использовать print(end = message)
. Используйте print(message, end = "")
— у меня нет источника, который говорит, что это лучше, но а) сообщение — это то, что вы печатаете, и end
оно предназначено для того, чтобы быть терминатором/разделителем по умолчанию для новой строки, которая проходит между содержимым, а не самим содержимым. б) как вы видите здесь end
, в отличие от print
функции в целом , не может принимать какой-либо объект. Вы можете print(x)
использовать для любого x
, даже если это не строка, но вы не можете использовать end = x
для не-строк.
Итак, простой способ исправить это -:
def erroring(a, b, c):
print(b, end = "")
(В любом случае, зачем тебе это нужно end = ""
? Кроме того, что именно вы пытаетесь сделать?)