oscript-ui
oscript-ui

Страница ошибки

Страница ошибки — тело ответа, когда показать запрошенное нельзя: «не найдено», «нет доступа», «сервер не справился». Крупно стоит код состояния HTTP, под ним — приглушённое пояснение, что случилось и куда идти дальше. Шапку, тему и статику вокруг добавляет каркас страницы, как у любой другой страницы.

Когда использовать#

  • Запрошенного объекта нет: 404.
  • Объект есть, но этому человеку его видеть нельзя: 403.
  • Сервер не смог ответить, и человеку нужно сказать об этом по-человечески: 500, 503.

Не берите страницу ошибки, когда объект есть, но пуст, — это пустое состояние. Ошибка отправки формы показывается тостом над той же формой, а не отдельной страницей: введённое не должно пропасть.

Код и пояснение#

Код — целое от 100 до 599, оно печатается заголовком первого уровня. Сообщение — абзац под ним.

404

404

Объект не найден

HTML = Набор.СтраницаОшибки().Отрисовать(Новый Структура("Код, Сообщение", 404, "Объект не найден"));

Пояснение необязательно. Без него остаётся один код — так бывает, когда объяснять причину отказа значит раскрыть лишнее.

403 без пояснения

403

HTML = Набор.СтраницаОшибки().Отрисовать(Новый Структура("Код", 403));

В дереве холста код ставится позицией; слов у узла нет, поэтому пояснение приходит прежней моделью, как в разделе Узлом холста ниже (см. Язык узлов).

Узлом холста — словами

403

HTML = Кит.СтраницаОшибки(403).Рендер();

Компонент только печатает тело. Состояние ответа ставит контроллер — тот же код, что на странице: страница «404» с ответом 200 обманет и поисковик, и мониторинг.

Ответ.УстановитьСостояниеНеНайдено();
Ответ.ТелоТекст = Каркас.Страница("Не найдено", Набор.СтраницаОшибки().Отрисовать(
	Новый Структура("Код, Сообщение", 404, "Такой страницы нет")), Контекст);

Пояснение со ссылкой#

СообщениеHTML — пояснение своей разметкой, обычно со ссылкой туда, где искать дальше. Оно задаётся вместо Сообщение и вставляется как есть: собирайте его кодом, а не из адреса запроса.

404 с ходом к списку

404

Документ мог быть удалён или переехать. Вернитесь к списку документов.

HTML = Набор.СтраницаОшибки().Отрисовать(Новый Структура("Код, СообщениеHTML", 404, "Документ мог быть удалён или переехать. Вернитесь <a href=""/документы"">к списку документов</a>."));

503 — сервер на обслуживании

503

Идёт обновление. Через несколько минут всё заработает — данные не пострадают.

HTML = Набор.СтраницаОшибки().Отрисовать(Новый Структура("Код, Сообщение", 503, "Идёт обновление. Через несколько минут всё заработает — данные не пострадают."));

Код вне 100..599 или не целый — ошибка разработчика, и кит отказывается печатать такую страницу.

Код 42 — исключение с объяснением

Попытка HTML = Набор.СтраницаОшибки().Отрисовать(Новый Структура("Код", 42)); Исключение HTML = Набор.Тост().Отрисовать(Новый Структура("Текст, Вид", ИнформацияОбОшибке().Описание, "ошибка")); КонецПопытки;

Гайдлайны#

404

Проекта нет — возможно, его удалили. Все проекты.

ДелайтеПояснение по-человечески и с ходом дальше
Код
HTML = Набор.СтраницаОшибки().Отрисовать(Новый Структура("Код, СообщениеHTML",
	404, "Проекта нет — возможно, его удалили. <a href=""/проекты"">Все проекты</a>."));

500

Поле объекта не обнаружено (Ссылка) at Модуль.ПолучитьПроект(), строка 214

Не делайтеПояснение языком сервера: человеку нечего с ним делать
Код
HTML = Набор.СтраницаОшибки().Отрисовать(Новый Структура("Код, Сообщение",
	500, "Поле объекта не обнаружено (Ссылка) at Модуль.ПолучитьПроект(), строка 214"));

403

У вас нет доступа к этому пулу. Попросите владельца пула добавить вас в участники.

ДелайтеОтказ в доступе говорит, к кому идти
Код
HTML = Набор.СтраницаОшибки().Отрисовать(Новый Структура("Код, Сообщение",
	403, "У вас нет доступа к этому пулу. Попросите владельца пула добавить вас в участники."));

403

Доступ запрещён! Вы не имеете права здесь находиться.

Не делайтеОтказ, который винит человека
Код
HTML = Набор.СтраницаОшибки().Отрисовать(Новый Структура("Код, Сообщение",
	403, "Доступ запрещён! Вы не имеете права здесь находиться."));

Доступность#

  • Код печатается <h1>: это первый и главный заголовок страницы, скринридер начнёт с него.
  • Сообщение экранируется — адрес запроса или текст исключения, попавший в пояснение, разметкой не станет. СообщениеHTML не экранируется, поэтому его собирают только из своих строк.
  • Код в заголовке понятен не всем. Где можно, пусть пояснение называет ситуацию словами («Страницы нет», «Нет доступа»), а не повторяет одно число.
  • Заголовок вкладки браузера задаёт каркас (первый параметр Каркас.Страница): пишите в него слова, а не код.

Узлом холста#

На холсте тело отказа — узел рода «отказ».

Страница ошибки узлом дерева

404

Объект не найден

HTML = Кит.СтраницаОшибки(Новый Структура("Код, Сообщение", 404, "Объект не найден")).Рендер();

Модель#

Структура ниже — модель и для набора, и для Кит.СтраницаОшибки: без пояснения узлу хватает одного кода.

СтраницаОшибки.Отрисовать()src/Классы/компоненты/СтраницаОшибки.os

Отрисовывает тело страницы отказа: код состояния и приглушённое пояснение.

Параметры:
 Модель - Структура - Код (состояние HTTP, целое 100..599, ОБЯЗАТЕЛЕН), Сообщение
          (экранируется), СообщениеHTML (ДОВЕРЕННАЯ разметка, вместо Сообщение).

Возвращаемое значение:
 Строка - HTML-фрагмент. Кидается исключением, если Код невалиден.

Кит.СтраницаОшибки()src/Классы/холст/Кит.os

Тело страницы отказа: код состояния и пояснение.

Параметры:
 Модель - Структура, Число - модель компонента «Страница ошибки» либо код состояния.

Возвращаемое значение:
 ЭлементЭкрана