По предложению NunFur я изменил свой подход и вместо того, чтобы выдавать ошибку, я возвращаю «более богатый» объект.
Существует как минимум два варианта, первый из которых заключался бы в инкапсуляции моего бизнес-объекта в объект ответа с некоторыми свойствами состояния. Я попробовал это, но это делает JSON более сложным.
Поэтому вместо добавления нового объекта я добавил два свойства в свой бизнес-объект, что-то вроде ServiceStatus и ServiceMessage. По умолчанию это 200 и '', но они могут быть установлены кодом WebMethod, если что-то пойдет не так (нет доступа, правильная ошибка). В этом случае их бизнес-объект будет «пустым» (без данных). Затем код JavaScript сначала проверяет ServiceStatus и реагирует соответствующим образом.
Я добавляю два поля ко всем моим объектам, которые возвращаются WebMethods, даже простую строку. Они должны реализовать интерфейс с этими двумя свойствами.
Теперь у меня есть полный контроль над тем, что происходит по проводам на случай, если произойдет что-то неожиданное.
Спасибо за ввод