В случае ошибки, обязательно ли функции что то вовзращать?
Обычно языки имеют такую штуку, как исключения. В случае ошибки, выполнение функции прерывается, бросается исключение. В противном случае, функция возвращает результат работы. Иногда можно обработать исключение в рамках выполнения функции. Иногда можно его обработать в месте, где эта функция вызывается. Все зависит от ситуации.
Уважаемый Дон. Есть ещё третий вариант. Передать в функцию объект и одним из его свойств назначать, что функция действительно получила конечный результат. И без выставления этого свойства любой ответ признаётся невалидным. 
Все зависит от задачи.