Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
Интересует такой вопрос Есть некий класс в методе OnBeforeSave, которго происходит валидация свойств экземпляра. Каким образом можно сделать так, чтобы, если валидация провалилась (свойства заполнены не верно), пользователю выдвалось мое собственное сообщение об ошибке и сохранение не происходило. Пользовательский интерфейс построен на ZEN и сохранение идет через DataController. Добился отмены сохранения, возвращая из OnBeforeSave $$$ERROR(), но никак не получается отобразить вменяемое сообщение об ошибке. Если вызвать при проверке (в OnBeforeSave) Код: plaintext 1. Подскажите как правильно поступать в таком случае? PS: Вызывать отдельно из приложения метод валидации не желательно - слишком большие накладные расходы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 04:29 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
ToshПодскажите как правильно поступать в таком случае? Всегда проверку даных делали "до" отправки на запись. По возможности средствами на клиенте... Что-то я вообще сомневаюсь, что OnBeforeSave замышлялся для проверки записываемых данных... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 08:42 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
По идее, оно возвращает статус, и уже исходя из этого статуса на клиенте можно выводить или не выводить сообщение. А пихать элементы пользовательского интерфейса прямо внутрь механизама работы как-то нехорошо, имхо. Но если сильно надо, можно попробовать делать анализ того, чем же является $io, определены ли %session и т.д., в зависимости от этого уже менять вид ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:15 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
В том-то и дело, что о логике данных знает только сам класс - он за ней и следит Надо делать проверку не на клиенте (в ZEN сильно тормозит вызов Cache Object Script), а именно самим классом. Может, OnBeforeSave не для этого нужен (тогда для чего?), но что тогда надо использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:17 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.По идее, оно возвращает статус, и уже исходя из этого статуса на клиенте можно выводить или не выводить сообщение. А пихать элементы пользовательского интерфейса прямо внутрь механизама работы как-то нехорошо, имхо. Но если сильно надо, можно попробовать делать анализ того, чем же является $io, определены ли %session и т.д., в зависимости от этого уже менять вид ошибки. Возможно, но "статусов на всех не напасешься" :) В SQL Server я просто рейзил ошибку при попытке введения неверных данных с полным разъяснением, а эту ошибку уже отображало приложение - думаю, что что-то подобное можно сделать и здесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:19 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
По-моему, OnBeforeSave годится для проверки ошибок, но ошибку все-таки выводить надо не напрямую из него. Все-таки %Save() вызывается откуда-то, туда должен возвращаться статус и там уже должно определяться, что делать в случае ошибки. А статусов по сути дела всего два - или 0 (с пояснениями) или 1. Или нет? C ZEN не работал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:25 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
Хотя вру, если OnBeforeSave возвращает не 1, то программа вылетает на обработчик ошибок, а не возвращается в исходную программу Каше 5.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:31 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
ToshМожет, OnBeforeSave не для этого нужен (тогда для чего?) Я так думаю для неких "хитроумных" согранений, ведения неких журналов-событий... Toshно что тогда надо использовать? Х/з... Все зависит от задачи... А класс не ваш чтоли? Почему вы о нем ничего не знаете? Если сами лезете в OnBeforeSave, то с тем же успехом напишите метод который будет проверять корректность данных, а потом выдавать информацию... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:34 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.C ZEN не работал Аналогично... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:36 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
krvsaА класс не ваш чтоли? Почему вы о нем ничего не знаете? Если сами лезете в OnBeforeSave, то с тем же успехом напишите метод который будет проверять корректность данных, а потом выдавать информацию... Класс мой, но, по очень давней привычке, стараюсь не мешать бизнес-логику с интерфейсом - потому и очень не хочу вызывать методы класса из интерфеса - пусть он сам себя контролит при сохранении. Я так понимаю, что в Cache' нет элементарного Exception'а, который можно бы было создать при ошибке валидации (со всеми объяснениями куда идти пользователю), а в интерфейсе просто поймать и отобразить? Или я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:40 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
авторА класс не ваш чтоли? Почему вы о нем ничего не знаете? Вызовы таких функций как %OnBeforeSave() каше втыкает в метод %SerializeObject (который вызывается из %Save) Код: plaintext Как видим при ошибке просто идет переход на обработчик ошибок. Кстати это вариант: не выводить ничего в %OnBeforeSave(), а ловить и выводить это в обработчике ошибок. А уж он то наверно в разном контесте будет разный, можно по разному обрабатывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:43 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
Простите - а поподробнее можно? я что-то не успеваю за вами ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:45 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
авторет элементарного Exception Чем не подходит $ZTRAP? Я могу ошибаться, но в более поздних версиях каше обработка ошибок изменена и там как-бы не впрямую используются try... catch. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:45 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.Чем не подходит $ZTRAP? Я могу ошибаться, но в более поздних версиях каше обработка ошибок изменена и там как-бы не впрямую используются try... catch. В принципе - подходит ... одна малость - отобразить ошибку надо в ZEN странице и остановить при этом выполнение java кода, который на ней выполняется - вот в этом вся проблема. В принцип - остановка java кода даже не нужна - а вот вывести java alert пользователю во время - это очень даже не помешает ... вот только как это сделать - если нельзя создать исключение с текстом описания ошибки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:48 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
К сожалению очень приблизительно понимаю работу ZEN. А разве там используется JAVA? Я думал, что только JS :-( Если используется JS, то так же в обработчике ошибок сделать &js<alert('сообщение об ошибке')> В принципе должно получится на вид то же самое, но в самом классе не будет вывода ошибки. Единственно, я не знаю, где там втыкается обработчик ошибок :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 09:54 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
ToshЯ так понимаю, что в Cache' нет элементарного Exception'а, который можно бы было создать при ошибке валидации (со всеми объяснениями куда идти пользователю) Это может сделать "пользовательский" метод класса... Toshа в интерфейсе просто поймать и отобразить? Или я не прав? Вот ответ этого метода можно ловить и отображать. Что-то меня настораживает сам факт чего-то деланья после возникновения ошибки. Вроде как всегда старались делать без ошибок, а тут бац! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 10:25 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
вот люди.... Для валидации - есть соотвествующий OnValidate, OnBeforeSave никуда в трап не вываливается - а возращает ошибку - которая возращается в %Save() %Status имеет либо значение 1, либо не not=1 а именно $$$ERROR(код ошибки, описание ошибки) Мы делаем свой метод на странице - который производит работу с объектами и получает %Status - если статус $$$ISERR то вытаскиваем его через d $system.OBJ.DisplayError(err), а точнее анологичный код - и выводим пользователю через алерт... В самом OnBeforeSave выводить &js бессмысленно - мало ли откуда вы его вызовете , на кой вам мусор на $P устройстве ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 11:12 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
Tosh >>но никак не получается отобразить вменяемое сообщение об ошибке. Что именно отображается ? Какие коды ошибок в $$$ERROR используете ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 11:15 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
Код: plaintext %OnValidateObject вызывается из %ValidateObject, он в свою очередь из %SerializeObject, которое вызывается из %Save в %SerializeObject есть код Код: plaintext Мож у нас сильно разные каше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 11:47 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
>>То есть если валидация при сохранении не проходит, то вываливаемяс в ошибку, и никаких возвратов статуса. А почему ты думаешь что в трапе не обрабатывается SC ? OnXXX обротчики потому и возращают %Status что бы можно было его из %Save вернуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 11:54 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
Как раз sc и вернется Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 11:58 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
А разве обработчики ошибок не обрывают выполнение программы? Как(и куда) она вернет статус? Куда они возвращают управление, если сделать quit из обработчика ошибок? Разве в %Save? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 11:58 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.А разве обработчики ошибок не обрывают выполнение программы? Как(и куда) она вернет статус? Куда они возвращают управление, если сделать quit из обработчика ошибок? Разве в %Save? Вернет туда откуда вызывался ..%SerializeObject(), Трап - это по сути дела продвинутый - конеткст вызванного метода/программы остается тем же. Собсно для этого они и нужны - вот если не указать - тогда сработает системный трап - и прекратить выполнение метода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 12:02 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
Поэкспериментировал. Действительно возвращает. На уровень выше места, где был установлен $ZTRAP Возврат управления (и значения) на уровень выше, чем установлен $ZT, причем со значением, возвращаемым из обработчика - все логично с другой стороны. Иначе бы непонятно до какого места "проваливаться". Только как-то непривычно все это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 12:16 |
|
||
|
Создание ошибки
|
|||
|---|---|---|---|
|
#18+
если кому еще интересно - разобрался в ситуации - на самом деле существует две проблемы 1. При генерации ошибки (q $$$ERROR(1000, "Ошибка")) в ZEN вылазит окно с техническим текстом, на котором само сообщение об ошибке теряется (пользователю не надо знать откуда свлилась эта ошибка - ему интереснее само сообщение, что он ввел верхнюю дату диаппазона меньше, чем нижнюю) 2. При возникновении ошибки в JS при Save контроллера (собственное исключение в OnBeforeSave, как в предыдущем пункте) - в JS мне так и не удалось определить произошла ли ошибка или нет - DataController сам отобразил сообщение об ошибке и задавил ее так, что снаружи не было видно, что она произошла. К стати - в документации написано, что Save должен возвращать пустую строку если произошла ошибка при сохранении, на деле - он вернет пустую строку только для новой записи, а при редактировании вернет правильный ID редактируемой записи (достаточно просто посмотреть код как это работает) В связи с этими ошибками возникает стойкое желание сделать своего наследника для DataController'а, но я плохо представляю что надо сделать, чтобы его можно было указывать в XML описании страницы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2008, 01:34 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=35247447&tid=1558926]: |
0ms |
get settings: |
6ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 316ms |

| 0 / 0 |
