Повышение исключения против печати? - PullRequest
9 голосов
/ 27 января 2010

В чем разница между выдачей исключения и простой печатью ошибки.

Например, какая польза от использования следующего:

if size < 0:
        raise ValueError('number must be non-negative')

вместо простого:

if size < 0:
        print 'number must be non-negative'

Я новичок, пожалуйста, успокойся со мной. :)

Ответы [ 4 ]

8 голосов
/ 27 января 2010

Возникновение ошибки останавливает всю программу в этой точке (если исключение не обнаружено), тогда как печать сообщение просто записывает что-то в stdout - вывод может быть передан другому инструменту, или кто-то может не запускать ваше приложение из командной строки, и вывод print может быть никогда не виден.

Например, что если ваш код выглядит так:

if size < 0:
    print 'size must be non-negative'
else:
    print size * 4

и я называю ваш сценарий следующим образом:

yours.py number_source.txt | sum_all_lines.sh

Если yours.py выводит простой текст между цифрами, то, возможно, мой sum_all_lines.sh не удастся, потому что ожидал всех чисел. Однако, если yours.py выйдет из-за исключения, то sum_all_lines.sh не завершится, и мне будет понятно, почему сумма не удалась.

Конечно, это только один пример, и ваш конкретный случай может быть совершенно другим.

6 голосов
/ 27 января 2010

Зависит от того, сможете ли вы обработать size < 0 в точке, где обнаружено size < 0.

Если вы можете обработать это, печатая сразу, то print, в противном случае, создайте исключение, чтобы делегировать обработку этого условия чему-то еще дальше по стеку вызовов, например:

def divide_three_by(val):
   if val == 0:
     raise ValueError("Can't divide by 0")
   return 3/val

try:
   divide_three_by(some_value_from_user)
except ValueError:
   print "You gave stupid input"

В приведенном выше примере (по общему признанию очень надуманного) функция divide_three_by не знает, что делать, если вы передаете 0 - иногда вы можете просто захотеть напечатать сообщение (например, если val поступило от ввода пользователя ), иногда вы можете просто игнорировать его и назначить значение по умолчанию. Так как функция не знает, что делать, она должна передать ответственность за обработку этого условия в стеке вызовов любому вызывающему его (и если это не может быть обработано там, она будет продолжать передаваться по стеку вызовов, пока что-то не обработает его или до тех пор, пока она не достигнет верхнего уровня, после чего ваша программа завершит работу.)

Подробнее об обработке исключений в Python - посмотрите учебник Ошибки и исключения в документации по Python.

3 голосов
/ 27 января 2010

Другое соображение относится к разработке модуля, который может использоваться в других программах. В этом случае предпочтительнее выдать исключение и позволить вызывающему коду обработать ошибку. Звонящий должен знать, что что-то пошло не так, и действовать соответственно.

... Richie

2 голосов
/ 27 января 2010

Разница в том, будет ли программа продолжаться после проверки ошибок.

Для этого случая:

if size < 0:
    print 'number must be non-negative'

Это просто распечатает сообщение на стандартный вывод, и программа продолжит проверку. Так что если в какой-то момент в вашем коде вы используете size, а оно меньше 0, вы можете получить ошибку.

Для другого случая:

if size < 0:
    raise ValueError('number must be non-negative'

В этом случае программа не будет проходить после вашей проверки, будет сгенерировано исключение. Если это не обработано, то вся программа будет завершена.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...