Ответ 1
Нет очевидного ответа, поскольку обработка зависит от того, как вы хотите сообщить код вызывающей ошибки. (Или даже если вы хотите интерпретировать это как "ошибку".)
Некоторые библиотеки/программы действительно не любят создавать исключения, поэтому делают все с сигнальными значениями. В этом случае возвращение NaN (потому что значение выражения технически undefined) является разумным выбором.
Вы также можете захотеть вернуть NaN, если вы хотите "бесшумно" передать значение вперед через несколько других вычислений. (Опираясь на поведение, которое NaN в сочетании с чем-либо еще "тихо" NaN.)
Но учтите, что если вы вернете NaN для среднего значения пустой последовательности, вы наложите нагрузку на код вызова, который им нужен, чтобы проверить возвращаемое значение функции, чтобы убедиться, что это не NaN - либо сразу после возврата или позже. Это требование легко пропустить, в зависимости от того, насколько вы верны при проверке возвращаемых значений.
Из-за этого другие библиотеки/программы берут точку зрения, что условия ошибки должны быть "шумными" - если вы передали пустую последовательность функции, которая находила среднее значение последовательности, то вы явно делаете что-то серьезное, и вам должно быть совершенно ясно, что вы перепутались.
Конечно, если исключения могут быть подняты, их нужно обрабатывать, но вы можете сделать это на более высоком уровне, потенциально централизованном в точке, где это имеет смысл. В зависимости от вашей программы это может быть проще или больше по строкам вашей стандартной схемы обработки ошибок, чем двойная проверка возвращаемых значений.
Другие люди будут утверждать, что ваши функции должны быть надежными для ошибки. Для максимальной надежности вы, вероятно, не должны использовать ни NaN, ни исключение - вам нужно выбрать фактическое число, которое "имеет смысл" в качестве значения для среднего пустого списка.
Какое значение будет очень специфичным для вашего варианта использования. Например, если ваша последовательность представляет собой список различий/ошибок, вы можете вернуть 0. Если вы усредняете результаты тестов (набрали 0-100), вы можете вернуть 100 для пустого списка... или 0, в зависимости от вашей философии "стартовой" оценки. Все зависит от того, для чего будет использоваться возвращаемое значение.
Учитывая, что значение этого "нейтрального" значения будет сильно изменяться на основе точного варианта использования, вы можете фактически реализовать его в двух функциях - одной общей функции, которая возвращает NaN или создает исключение, а другая, что обертывает общую функцию и распознает случай ошибки. Таким образом, вы можете иметь несколько версий, каждый из которых имеет различный случай "по умолчанию". - или если это то, что вы делаете много, вы даже можете иметь значение по умолчанию, которое вы можете передать.
Опять же, ответа на этот вопрос нет: среднее значение пустой последовательности undefined. Как вы хотите справиться с этим, это зависит от того, для чего используется результат расчета: просто покажите или выполните дальнейшие вычисления? Должен ли пустой список быть исключительным, или его следует обрабатывать спокойно? Вы хотите обрабатывать специальный случай в тот момент, когда это происходит, или вы хотите поднять/отложить обработку ошибок?