Я думаю, стоит ли возвращать код ошибки или выбрасывать исключение, и сравнение между языками может быть полезным и информативным. Я предполагаю, что очень обобщенным ответом на эту проблему является просто соображение: набор допустимых возвращаемых значений для любой функции должен быть как можно меньшим и настолько большим, насколько необходимо .
Как правило, это будет означать, что если данный метод возвращает целое число в одном тестовом случае, пользователи могут по праву ожидать, что метод всегда вернет целое число или , бросив исключение. Но, конечно, концептуально самый простой способ не всегда является лучшим способом справиться с вещами.
Возвращаемое значение наименьшего сюрприза обычно None
; и если вы посмотрите на это, вы увидите, что именно семантика None
лицензирует его использование по всем направлениям: это одноэлементное неизменное значение, которое во многих случаях оценивается как False
или запрещает дальнейшие вычисления - без конкатенации, без арифметики. Поэтому, если вы решили написать метод frob(x)
, который возвращает число для строкового ввода, и None
для нечисловых строк и любого другого ввода, и вы используете это внутри выражения, такого как a=42+frob('foo')
, вы все равно получите Исключение очень близко к точке, где произошли поддельные вещи. Конечно, если вы добавите frob('foo')
в столбец базы данных, который не был определен с NOT NULL
, вы можете столкнуться с проблемами, возможно, спустя месяцы. Это может или не может быть оправдано.
Так что в большинстве случаев, когда вы, например, вы хотите получить число из строки, используя somwething наподобие float(x)
или int(x)
, так как эти встроенные функции вызовут исключение, когда не будет введен усваиваемый ввод. Если это не подходит вашему варианту использования, рассмотрите возможность возврата None
из пользовательского метода; в основном это возвращаемое значение говорит потребителям, что «извините, я не смог понять ваш вклад». Но вы захотите делать это только в том случае, если вы точно знаете, что продолжение вашей программы имеет смысл с этого момента.
Видите ли, я только что узнал, как превратить каждое уведомление, предупреждение и сообщение об ошибке в потенциально исключающую остановку показа в PHP. Меня просто сводит с ума, что опечатка в имени переменной генерируется в стандартной конфигурации PHP, - только уведомление для пользователя . Это так что плохо. Программа просто продолжает делать что-то с программным кодом, который вообще не имеет смысла! Я не могу поверить, что люди находят эту особенность.
Точно так же следует рассматривать это так: если в любой данный момент времени можно с разумными затратами утверждать, что выполнение фрагмента кода больше не имеет смысла - поскольку значения отсутствуют, их нет граничит, или имеет неожиданный тип, или когда ресурсы, такие как соединение с базой данных, перестали работать - крайне важно минимизировать головную боль отладки, прервать выполнение и передать управление на любой уровень в коде, который чувствует себя способным справиться с неудачей.
Опыт показывает, что воздерживаться от ранних действий и позволять фиктивным значениям проникать в ваши данные - это не что иное, как затруднить отладку кода. Так много примеров чрезмерного усердного приведения типов: допустимо добавлять целые числа в числа с плавающей точкой. Допускать добавление к числу строки без цифр, кроме цифр, является ложной практикой, которая может приводить к странным, нелокальным ошибкам, которые могут появиться в любой строке, обрабатывающей эти данные.