в классическом варианте возвращают заголовок http status code 4xx, 5xx
но без body это быстро становится неудобным, тк абсолютно неясно что произошло - может просто вебсервер прилег
поэтому лучше передавать json в body с детальным описанием ошибки
и по мне, так лучше возвращать 200 с телом result: {}, error: { code: 42, desc: ... }
(по своему вкусу)
и чекать что error не пустой
и тогда статусы отличные от 200 сигнализируют, что что-то не так с веб-сервером, а не с приложением
что бы "почувствовать разницу" попробуйте написать обработчики then/catch для `$.ajax('/api/order/123')`и различить в них когда ошибка от приложухи, а когда от вебсервера
нельзя возвращать 200 в случае ошибки
1) это плохая привычка, потому что она сработает на этом проекте, но не сработат на другом
2) почти все грамотные библиотеки умеют работать со статусами
3) тесты работают со статусами
4) люди читают одни и те же книги и в общем следуют рекомендациям, а тут тебе вдруг 200 но реквест не суккес
5) ожидать не 200 нормально
6) если все всегда 200 - подозрительно (все всегда работать не может)
7) что делать с 204, 201? оверрайдить ответ каждого экшена вручную?