Если у меня есть функция, я запрашиваю некоторые данные с веб-сайта, но когда я получаю сообщение об ошибке, я хочу распечатать ошибку и перезапустить свой код. Но я не знаю точного кода, может кто-нибудь мне помочь? Это пример кода:
import time
input1 = input("Blabla: ")
def repeat():
try:
if input1 == "123":
raise "Error: 123"
except Exception as e:
print(e)
time.sleep(5) # Wait 5 seconds
repeat() # Rerun code
repeat()
Когда я запускаю этот код, я получаю сообщение об ошибке «исключения должны происходить из BaseException». Кто-нибудь может мне помочь?
Вы также, вероятно, захотите переместить input1 = input("Blabla: ") внутрь своей функции (иначе это значение никогда не изменится при рекурсии)
Поскольку вы всегда перехватываете исключение и хотите только распечатать его, может быть, имеет смысл вообще не вызывать исключение. Вместо этого вы можете просто print("Error: 123") напрямую.






Вы не можете просто вызывать случайные строки в качестве исключения. Если вы хотите вызвать общее исключение без определения соответствующего типа, просто поднимите Exception, заменив:
raise "Error: 123"
с участием:
raise Exception("Error: 123") # The "Error: " should probably be removed
В качестве альтернативы, если вы можете использовать более конкретную ошибку, сделайте это. Если 123 недопустимо из-за неправильного значения, используйте ValueError вместо Exception. Если есть какая-то более конкретная причина, создайте подкласс, чтобы другим было легче его поймать, например. (на верхнем уровне модуля):
class SpecialValueError(ValueError):
pass
поэтому вы можете сделать:
raise SpecialValueError("Error: 123")
и люди могут поймать его специально или через простые except ValueError:, except Exception: и т. д.
Я как-то не упомянул метод __str__() производного класса исключений, так как был запрошен печать исключения.
@guidot: я не уверен, что ты имеешь в виду. BaseException предоставляет полезное значение по умолчанию __str__ (это просто любое сообщение, которое вы передали в качестве первого аргумента); довольно редко вам нужно определить замену __str__, но ничто не мешает этому.
Прямо сейчас вы печатаете объект ошибки str, а вам нужно распечатать его представление
Попробуй это:
def repeat():
try:
if input1 == "123":
raise Exception("Error: 123") # You need to use an Exception class
except Exception as e:
print(repr(e)) # Notice I added repr()
time.sleep(5)
repeat()
Нить:
try:
raise Exception("Exception I am!")
except Exception as e:
print(e)
# Output: Exception I am!
Представление:
try:
raise Exception("Exception I am!")
except Exception as e:
print(repr(e))
# Output: Exception('Exception I am!')
Это своего рода побочная проблема из проблемы OP (невозможность вызвать настоящий тип исключения). Как вы думаете, зачем нужен repr? Это просто добавило бы ненужные кавычки вокруг вывода.
Не используйте рекурсивный вызов для «перезапуска кода». Используйте петлю, для этого они и нужны.