5. Обработка ошибок
Для вебморды обработка ошибок -- это одна из самых важных тем, ибо из-за большого количества объектов. Пойти что-то не так -- может что угодно.
В идеале -- нужно обрабатывать два вида ошибок:
- Что-то свалилось на фронтенде (где-то произошел throw new Error('message'))
- Что-то свалилось на бэкенде (BUSI_EXCEPTION/любая другая системная ошибка/выпадение в дамп при обработке запроса)
Чтобы каждый раз не дублировать код обработки ошибок, ОЧЕНЬ РЕКОМЕНДУЕТСЯ выносить его отдельно в утилитарный класс и вызывать.
Т.е. нагроможденную конструкцию
this.getView().setBusy(true);
this.getModel().read("/Entity('key'", {
///.......
error: function () {
sap.m.MessageBox.error("Error!", {
styleClass: this.getOwnerComponent().getContentDensityClass()
});
this.getView().setBusy(false);
},
success: function(oData){
// Обработка, которая тоже потенциально может вызвать ошибки
// И в ней тоже придётся делать
// try { } catch (e) { }
// здесь ожидается callback hell
}
});
можно заменить на более минималистичную и наглядную:
this.getView().setBusy(false);
try{
const entity = await this.useOdata().read("/Entity('key')");
// Обработка, которая тоже потенциально может вызвать ошибки
// throw new Error("при обработке Х произошла ошибка");
} catch(e) {
this.showMessage(e); // Вынесенный в родительский класс метод парсинга ошибки с oData
} finally {
this.getView().setBusy(false);
}
В общем случае, можно прямо так и оставить одну строку с обработкой.
Если нужно для бизнес логики -- можно прямо здесь сделать проверку и поймать нужную ошибку.
Для унификации -- предлагаю класс с парсером ошибок и класс BaseController, у которого есть явные методы по отображению ошибок пользователю.
Используем правильный контрол
- Информационные сообщения, и сообщения об успехе -- можем показывать через Message Toast
- Сообщения об ошибках и предупреждения показываем пользователю явно -- во всплывающем диалоге (MessageBox или Dialog). Для отображения нескольких ошибок -- используем MessageView.
(Если вы используете BaseController из моего репозитория -- у вас это уже зашито в метод showMessage() )