Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Создание ошибки / 25 сообщений из 30, страница 1 из 2
10.04.2008, 04:29
    #35246914
Tosh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
Интересует такой вопрос
Есть некий класс в методе OnBeforeSave, которго происходит валидация свойств экземпляра.
Каким образом можно сделать так, чтобы, если валидация провалилась (свойства заполнены не верно), пользователю выдвалось мое собственное сообщение об ошибке и сохранение не происходило.
Пользовательский интерфейс построен на ZEN и сохранение идет через DataController.
Добился отмены сохранения, возвращая из OnBeforeSave $$$ERROR(), но никак не получается отобразить вменяемое сообщение об ошибке.
Если вызвать при проверке (в OnBeforeSave)
Код: plaintext
1.
  &js<alert('сообщение об ошибке')>
все проходит, но как это будет выглядеть если будет использоваться не ZEN, а другой движок, не поддерживающий Яву?
Подскажите как правильно поступать в таком случае?
PS: Вызывать отдельно из приложения метод валидации не желательно - слишком большие накладные расходы
...
Рейтинг: 0 / 0
10.04.2008, 08:42
    #35247006
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
ToshПодскажите как правильно поступать в таком случае?
Всегда проверку даных делали "до" отправки на запись. По возможности средствами на клиенте...

Что-то я вообще сомневаюсь, что OnBeforeSave замышлялся для проверки записываемых данных...
...
Рейтинг: 0 / 0
10.04.2008, 09:15
    #35247050
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
По идее, оно возвращает статус, и уже исходя из этого статуса на клиенте можно выводить или не выводить сообщение.
А пихать элементы пользовательского интерфейса прямо внутрь механизама работы как-то нехорошо, имхо.

Но если сильно надо, можно попробовать делать анализ того, чем же является $io, определены ли %session и т.д., в зависимости от этого уже менять вид ошибки.
...
Рейтинг: 0 / 0
10.04.2008, 09:17
    #35247056
Tosh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
В том-то и дело, что о логике данных знает только сам класс - он за ней и следит
Надо делать проверку не на клиенте (в ZEN сильно тормозит вызов Cache Object Script), а именно самим классом. Может, OnBeforeSave не для этого нужен (тогда для чего?), но что тогда надо использовать?
...
Рейтинг: 0 / 0
10.04.2008, 09:19
    #35247063
Tosh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
Блок А.Н.По идее, оно возвращает статус, и уже исходя из этого статуса на клиенте можно выводить или не выводить сообщение.
А пихать элементы пользовательского интерфейса прямо внутрь механизама работы как-то нехорошо, имхо.

Но если сильно надо, можно попробовать делать анализ того, чем же является $io, определены ли %session и т.д., в зависимости от этого уже менять вид ошибки.
Возможно, но "статусов на всех не напасешься" :)
В SQL Server я просто рейзил ошибку при попытке введения неверных данных с полным разъяснением, а эту ошибку уже отображало приложение - думаю, что что-то подобное можно сделать и здесь
...
Рейтинг: 0 / 0
10.04.2008, 09:25
    #35247079
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
По-моему, OnBeforeSave годится для проверки ошибок, но ошибку все-таки выводить надо не напрямую из него. Все-таки %Save() вызывается откуда-то, туда должен возвращаться статус и там уже должно определяться, что делать в случае ошибки.

А статусов по сути дела всего два - или 0 (с пояснениями) или 1. Или нет?
C ZEN не работал
...
Рейтинг: 0 / 0
10.04.2008, 09:31
    #35247098
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
Хотя вру, если OnBeforeSave возвращает не 1, то программа вылетает на обработчик ошибок, а не возвращается в исходную программу

Каше 5.2
...
Рейтинг: 0 / 0
10.04.2008, 09:34
    #35247102
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
ToshМожет, OnBeforeSave не для этого нужен (тогда для чего?)
Я так думаю для неких "хитроумных" согранений, ведения неких журналов-событий...
Toshно что тогда надо использовать?
Х/з... Все зависит от задачи... А класс не ваш чтоли? Почему вы о нем ничего не знаете? Если сами лезете в OnBeforeSave, то с тем же успехом напишите метод который будет проверять корректность данных, а потом выдавать информацию...
...
Рейтинг: 0 / 0
10.04.2008, 09:36
    #35247109
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
Блок А.Н.C ZEN не работал
Аналогично...
...
Рейтинг: 0 / 0
10.04.2008, 09:40
    #35247122
Tosh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
krvsaА класс не ваш чтоли? Почему вы о нем ничего не знаете? Если сами лезете в OnBeforeSave, то с тем же успехом напишите метод который будет проверять корректность данных, а потом выдавать информацию...
Класс мой, но, по очень давней привычке, стараюсь не мешать бизнес-логику с интерфейсом - потому и очень не хочу вызывать методы класса из интерфеса - пусть он сам себя контролит при сохранении.
Я так понимаю, что в Cache' нет элементарного Exception'а, который можно бы было создать при ошибке валидации (со всеми объяснениями куда идти пользователю), а в интерфейсе просто поймать и отобразить? Или я не прав?
...
Рейтинг: 0 / 0
10.04.2008, 09:43
    #35247127
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
авторА класс не ваш чтоли? Почему вы о нем ничего не знаете?
Вызовы таких функций как %OnBeforeSave() каше втыкает в метод %SerializeObject (который вызывается из %Save)
Код: plaintext
Set sc=..%OnBeforeSave(%objTX( 1 ,+%this, 4 )) If ('sc) { Ztrap "SO" } 

Как видим при ошибке просто идет переход на обработчик ошибок.

Кстати это вариант: не выводить ничего в %OnBeforeSave(), а ловить и выводить это в обработчике ошибок. А уж он то наверно в разном контесте будет разный, можно по разному обрабатывать.
...
Рейтинг: 0 / 0
10.04.2008, 09:45
    #35247135
Tosh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
Простите - а поподробнее можно? я что-то не успеваю за вами ;)
...
Рейтинг: 0 / 0
10.04.2008, 09:45
    #35247136
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
авторет элементарного Exception
Чем не подходит $ZTRAP?

Я могу ошибаться, но в более поздних версиях каше обработка ошибок изменена и там как-бы не впрямую используются try... catch.
...
Рейтинг: 0 / 0
10.04.2008, 09:48
    #35247142
Tosh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
Блок А.Н.Чем не подходит $ZTRAP?

Я могу ошибаться, но в более поздних версиях каше обработка ошибок изменена и там как-бы не впрямую используются try... catch.
В принципе - подходит ... одна малость - отобразить ошибку надо в ZEN странице и остановить при этом выполнение java кода, который на ней выполняется - вот в этом вся проблема.
В принцип - остановка java кода даже не нужна - а вот вывести java alert пользователю во время - это очень даже не помешает ... вот только как это сделать - если нельзя создать исключение с текстом описания ошибки?
...
Рейтинг: 0 / 0
10.04.2008, 09:54
    #35247158
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
К сожалению очень приблизительно понимаю работу ZEN.
А разве там используется JAVA? Я думал, что только JS :-(

Если используется JS, то так же в обработчике ошибок сделать
&js<alert('сообщение об ошибке')>
В принципе должно получится на вид то же самое, но в самом классе не будет вывода ошибки.
Единственно, я не знаю, где там втыкается обработчик ошибок :-(
...
Рейтинг: 0 / 0
10.04.2008, 10:25
    #35247266
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
ToshЯ так понимаю, что в Cache' нет элементарного Exception'а, который можно бы было создать при ошибке валидации (со всеми объяснениями куда идти пользователю)
Это может сделать "пользовательский" метод класса...
Toshа в интерфейсе просто поймать и отобразить? Или я не прав?
Вот ответ этого метода можно ловить и отображать.

Что-то меня настораживает сам факт чего-то деланья после возникновения ошибки. Вроде как всегда старались делать без ошибок, а тут бац!
...
Рейтинг: 0 / 0
10.04.2008, 11:12
    #35247447
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
вот люди....

Для валидации - есть соотвествующий OnValidate, OnBeforeSave никуда в трап не вываливается - а возращает ошибку - которая возращается в %Save()

%Status имеет либо значение 1, либо не not=1 а именно $$$ERROR(код ошибки, описание ошибки)

Мы делаем свой метод на странице - который производит работу с объектами и получает %Status - если статус $$$ISERR то вытаскиваем его через d $system.OBJ.DisplayError(err), а точнее анологичный код - и выводим пользователю через алерт...

В самом OnBeforeSave выводить &js бессмысленно - мало ли откуда вы его вызовете , на кой вам мусор на $P устройстве ?
...
Рейтинг: 0 / 0
10.04.2008, 11:15
    #35247459
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
Tosh >>но никак не получается отобразить вменяемое сообщение об ошибке.

Что именно отображается ? Какие коды ошибок в $$$ERROR используете ?
...
Рейтинг: 0 / 0
10.04.2008, 11:47
    #35247603
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
Код: plaintext
Для валидации - есть соотвествующий OnValidate, OnBeforeSave
Я привел пример сгенеренного инт-кода, где OnBeforeSave вываливается в обработчик ошибок

%OnValidateObject
вызывается из %ValidateObject,
он в свою очередь из %SerializeObject, которое вызывается из %Save

в %SerializeObject есть код
Код: plaintext
Set sc=..%ValidateObject() If ('sc) { Ztrap "SO" }
То есть если валидация при сохранении не проходит, то вываливаемяс в ошибку, и никаких возвратов статуса.
Мож у нас сильно разные каше?
...
Рейтинг: 0 / 0
10.04.2008, 11:54
    #35247645
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
>>То есть если валидация при сохранении не проходит, то вываливаемяс в ошибку, и никаких возвратов статуса.

А почему ты думаешь что в трапе не обрабатывается SC ?

OnXXX обротчики потому и возращают %Status что бы можно было его из %Save вернуть.
...
Рейтинг: 0 / 0
10.04.2008, 11:58
    #35247661
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
Как раз sc и вернется
Код: plaintext
1.
2.
3.
%SerializeObjectERR	Set $ZTrap="" If $extract($zerror, 1 , 5 )'="<ZSO>" Set sc=$$Error^%apiOBJ(5002,$ZE)
	If 'partial { Set $zobjval(, 2 , 0 , 3 , 2 ) =  0  }
	Quit sc
...
Рейтинг: 0 / 0
10.04.2008, 11:58
    #35247665
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
А разве обработчики ошибок не обрывают выполнение программы?
Как(и куда) она вернет статус?

Куда они возвращают управление, если сделать quit из обработчика ошибок?
Разве в %Save?
...
Рейтинг: 0 / 0
10.04.2008, 12:02
    #35247684
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
Блок А.Н.А разве обработчики ошибок не обрывают выполнение программы?
Как(и куда) она вернет статус?

Куда они возвращают управление, если сделать quit из обработчика ошибок?
Разве в %Save?

Вернет туда откуда вызывался ..%SerializeObject(), Трап - это по сути дела продвинутый - конеткст вызванного метода/программы остается тем же.

Собсно для этого они и нужны - вот если не указать - тогда сработает системный трап - и прекратить выполнение метода.
...
Рейтинг: 0 / 0
10.04.2008, 12:16
    #35247759
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
Поэкспериментировал.
Действительно возвращает. На уровень выше места, где был установлен $ZTRAP

Возврат управления (и значения) на уровень выше, чем установлен $ZT, причем со значением, возвращаемым из обработчика - все логично с другой стороны. Иначе бы непонятно до какого места "проваливаться".
Только как-то непривычно все это.
...
Рейтинг: 0 / 0
11.04.2008, 01:34
    #35249915
Tosh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ошибки
если кому еще интересно - разобрался в ситуации - на самом деле существует две проблемы
1. При генерации ошибки (q $$$ERROR(1000, "Ошибка")) в ZEN вылазит окно с техническим текстом, на котором само сообщение об ошибке теряется (пользователю не надо знать откуда свлилась эта ошибка - ему интереснее само сообщение, что он ввел верхнюю дату диаппазона меньше, чем нижнюю)
2. При возникновении ошибки в JS при Save контроллера (собственное исключение в OnBeforeSave, как в предыдущем пункте) - в JS мне так и не удалось определить произошла ли ошибка или нет - DataController сам отобразил сообщение об ошибке и задавил ее так, что снаружи не было видно, что она произошла. К стати - в документации написано, что Save должен возвращать пустую строку если произошла ошибка при сохранении, на деле - он вернет пустую строку только для новой записи, а при редактировании вернет правильный ID редактируемой записи (достаточно просто посмотреть код как это работает)

В связи с этими ошибками возникает стойкое желание сделать своего наследника для DataController'а, но я плохо представляю что надо сделать, чтобы его можно было указывать в XML описании страницы
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Создание ошибки / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]