Как распечатать исключение, если ошибка в коде?

Если у меня есть функция, я запрашиваю некоторые данные с веб-сайта, но когда я получаю сообщение об ошибке, я хочу распечатать ошибку и перезапустить свой код. Но я не знаю точного кода, может кто-нибудь мне помочь? Это пример кода:

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». Кто-нибудь может мне помочь?

Не используйте рекурсивный вызов для «перезапуска кода». Используйте петлю, для этого они и нужны.

Blorgbeard 01.04.2019 22:01

Вы также, вероятно, захотите переместить input1 = input("Blabla: ") внутрь своей функции (иначе это значение никогда не изменится при рекурсии)

Nathan 01.04.2019 22:02

Поскольку вы всегда перехватываете исключение и хотите только распечатать его, может быть, имеет смысл вообще не вызывать исключение. Вместо этого вы можете просто print("Error: 123") напрямую.

Nathan 01.04.2019 22:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
222
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не можете просто вызывать случайные строки в качестве исключения. Если вы хотите вызвать общее исключение без определения соответствующего типа, просто поднимите 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 01.04.2019 22:35

@guidot: я не уверен, что ты имеешь в виду. BaseException предоставляет полезное значение по умолчанию __str__ (это просто любое сообщение, которое вы передали в качестве первого аргумента); довольно редко вам нужно определить замену __str__, но ничто не мешает этому.

ShadowRanger 01.04.2019 22:55

Прямо сейчас вы печатаете объект ошибки 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? Это просто добавило бы ненужные кавычки вокруг вывода.

ShadowRanger 01.04.2019 22:08

Другие вопросы по теме