Почему мое сообщение об исключении не меняется с моим оператором if - PullRequest
1 голос
/ 29 марта 2020

В настоящее время у меня есть следующий код, который выдает ошибку на исключение, как я хочу:

try:
    something ....

except Exception as e:
            print(
                'You have encountered the following in the main function \n ERROR: {}'.format(e))

Однако в некоторых случаях, если я получаю указанное c исключение, такое как:

invalid literal for int() with base 10: ''

Я хочу изменить сообщение e в исключении на то, что я хочу ... как бы я go об этом?

If e == "invalid literal for int() with base 10: ''":
   e = 'my new message'
   print(e)


, но, похоже, оно не работает

1 Ответ

1 голос
/ 30 марта 2020

Попробуйте перехватить тип ошибки вместо анализа текста ошибки.

Дополнительную информацию можно найти в Обработка исключений раздела Python help но чтобы быть полностью внимательным (потому что я чувствую себя глупо, когда сначала отвечаю на вопрос Python в C#), вы можете отсортировать тип искомого исключения с помощью чего-то подобного:

>>> # Create the error
>>> int('3.6')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '3.6'

Где ValueError - это тип ошибки, который вам нужно отловить.

Более реалистично, вы можете включить его в свою программу, чтобы вы могли определить ее как непогашенные типы ошибок и (надеюсь) идентифицировать их во время тестирование:

>>> try:
... # something ....
...   int('3.6') # for the example, we'll generate error on purpose
... # Assume we've already figured out what to do with these 3 errors
... except (RuntimeError, TypeError, NameError):
...   print("We know what to do with these errors")
... # Our generic except to catch unhandled errors.
... except:
...   print("Unhandled error: {0}".format(err))

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: invalid literal for int() with base 10: '3.6'

После того, как вы определили новый тип ошибки, добавьте для него специальный c обработчик:

>>> try:
... # something ....
...   int('3.6')
... except (RuntimeError, TypeError, NameError):
...   print("We know what to do with these errors")
... # The newly added handler for ValueError type
... except ValueError:
...   print("And now we know what to do with a ValueError")
...   print("My new message")
... except:
...   print("Unhandled error: {0}".format(err))

And now we know what to do with a ValueError
My new message

Оригинальный (совершенно бесполезный) ответ хранится здесь для потомков (и поэтому комментарии имеют смысл) ...

Попробуйте перехватить тип ошибки, а не анализировать текст ошибки.

например,

catch (FileNotFoundException e)
{
    // FileNotFoundExceptions are handled here.
}
catch (IOException e)
{
    // Extract some information from this exception, and then
    // throw it to the parent method.
    if (e.Source != null)
        Console.WriteLine("IOException source: {0}", e.Source);
    throw;

}

, который копируется напрямую отсюда: Microsoft try-catch (C# ссылка)

...