powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Опять про RETURN и CANCEL - что лучше?
25 сообщений из 33, страница 1 из 2
Опять про RETURN и CANCEL - что лучше?
    #33245132
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леди и джентельмены! Всех с 1 сентября (хотя бы потому, что все мы были когда-то школьниками)!
У меня c месяц назад на форуме был топик "Защита от дураков срабатывает - зачем только ее писала?". Ссылка для тех, кто заинтересуется, что за ерунду я там спрашивала: http://]http://sql.ru/forum/actualthread.aspx?tid=209171
Там мне было сделано замечание, что я использую в кодах не RETURN, а CANCEL. Я согласилась, что поступаю не совсем правильно. А теперь опять засомневалась. Пример:
В форме используеся таблица из БД с установленными триггерами.
Кнопка "Удалить". В клике у нее прописываю:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
lnAnswer = MESSAGEBOX("ВНИМАНИЕ! Вы собираетесь УДАЛИТЬ этот населенный пункт. Пожалуйста, подумайте еще раз, прежде, чем нажать клавишу ДА.",  4 + 48 ,"Удаление населенного пункта" )
DO CASE
   CASE lnAnswer =  6 
   DELETE IN пункт
   REPLACE пункт WITH ALLTRIM(STR(пункт.КодПункт, 6 , 0 )) IN пункт && Чтобы можно было опять внести в таблицу это же название
   GO TOP 
   thisform.grПункт.Refresh 
   thisform.grПункт.SetFocus 
ENDCASE 
У этой же кнопки в Error Event я прописала:

Код: plaintext
1.
2.
3.
IF ERROR()= 1539 
=MESSAGEBOX("Удаление невозможно - этот населенный пункт в данный момент используется в адресах клиентов!", 48 )
RETURN
ENDIF 

Так вот. Если прописано RETURN, то в коде клика после сообщения об ошибке успешно выполняется REPLACE и все, что прописано за ним. Получается ерунда. А поставила CANCEL - работает как надо.
Что же правомерно прописывать в данном случае?
Благодарю.
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33245213
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TO Лисонька

Вообще Return ставится в конце кода, и срабатывает правильно после того когда все циклы завершились. А Cancel своего рода екстренное прерывания всего что за ним и прекращение выполнения данного кода.
Но можно в Return-e указывать на процедуру в которой ты можешь прописать прерывание и закрытие кода "RETURN TO ProcedureName"
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33245260
Maltsev Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лисонька, а ты REPLACE в тригер перенеси.

И будет тебе счастие ...
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33245270
Maltsev Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или оберни модификацию таблицы в Try ... Catch
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33246046
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maltsev MaxЛисонька, а ты REPLACE в тригер перенеси
Да, я нашла в хранимые в БД процедуры, отыскала процедуру триггера удаления на таблицу Пункт, поменяла строки после ON ERROR на свой код, но ничего не заработало - удаление спокойно проходит в любом случае. Нужно разбираться как следует и неспеша.

Или оберни модификацию таблицы в Try ... Catch
М-да-а, вот об этом я впервые слышу. В топиках хэлпа этих слов не нашла, а по поиску вышло нечто расплывчатое. Нельзя ли поподробнее, где отыскать описание try и catch.
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33246240
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, я прописала процедурный файл, внесла в процедуру часть кода Click с REPLAСE и далее поставила RETURN TO MASTER. Вот так вроде бы работает.
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33247061
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то здесь опять с логикой не то.

Что именно по Вашему должно произойти, если при выполнении какой-то команды произошла ошибка? Ну, вот в приведенном примере:

Код: plaintext
1.
DELETE && здесь произошла ошибка
* А здесь продолжение выполнения кода

Вы почему-то предполагаете, что выполнение кода должно остановиться на ошибочной команде и после обработки события Error() уже не выполняться. Почему собственно? В FoxPro этого не происходит. Поэтому подобные команды, как правило, окружают дополительными проверками

Код: plaintext
1.
2.
3.
DELETE
IF (произошла ошибка)
	RETURN	&& выходим из процедуры
ENDIF

Это общая схема. Как именно выполняется отлов ошибки - это уже другой разговор. Он тесно завязан на схему работы с данными. То, как было произведено удаление в данном случае - это крайне редко используемая ситуация. Обычно все-таки работают с буфером, а не напрямую с таблицей
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33247113
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМЧто-то здесь опять с логикой не то.
Уважаемый Учитель!
Ну тогда я уже вообще ничего не понимаю. Программа начала работать так, как мне представлялось.
В Click кнопки "Удалить":
Код: plaintext
1.
2.
3.
DO DelПункт
GO TOP 
thisform.grПункт.Refresh 
thisform.гр_grПункт.SetFocus
В Error event кнопки "Удалить":
Код: plaintext
1.
2.
3.
IF ERROR()= 1539 
=MESSAGEBOX("Удаление невозможно - этот населенный пункт в данный момент используется в адресах клиентов!", 48 )
RETURN TO MASTER 
ENDIF 
Процедурный файл:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
PROCEDURE DelПункт
nAnswer = MESSAGEBOX("ВНИМАНИЕ! Вы собираетесь УДАЛИТЬ этот населенный пункт. Пожалуйста, подумайте еще раз, прежде, чем нажать клавишу ДА.",  4 + 48 ,"Удаление населенного пункта" )
DO CASE
   CASE nAnswer =  6 
   DELETE IN пункт
   REPLACE пункт WITH ALLTRIM(STR(пункт.КодПункт, 6 , 0 )) IN пункт
ENDCASE 
ENDPROC

Если это вне логики, то почему работает?
Благодарю.
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33247145
автор
PROCEDURE DelПункт
nAnswer = MESSAGEBOX("ВНИМАНИЕ! Вы собираетесь УДАЛИТЬ этот населенный пункт. Пожалуйста, подумайте еще раз, прежде, чем нажать клавишу ДА.", 4+48,"Удаление населенного пункта" )
DO CASE
CASE nAnswer = 6
DELETE IN пункт
REPLACE пункт WITH ALLTRIM(STR(пункт.КодПункт,6,0)) IN пункт
ENDCASE
ENDPROC

Я думаю надо написать так
MESSAGEBOX("ВНИМАНИЕ! Вы собираетесь УДАЛИТЬ этот населенный пункт. Пожалуйста, подумайте еще раз, потом откиньтесь на спинку стула и
опять подумайте, сходите покурить-опять подумайте,
короче думайте и думайте, а ваще лучше админа позвать", 4+48,"Удаление населенного пункта" )
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33247162
О_В_Д
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Доброжелательный мессагер[/quot]
Я думаю надо написать так
MESSAGEBOX("ВНИМАНИЕ! Вы собираетесь УДАЛИТЬ этот населенный пункт. Пожалуйста, подумайте еще раз, потом откиньтесь на спинку стула и
опять подумайте, сходите покурить-опять подумайте,
короче думайте и думайте, а ваще лучше админа позвать", 4+48,"Удаление населенного пункта" )[/quot]


Главный прикольщик в детском саду? Здесь форум, а не чат Кроватка. Либо админа часто зовешь на помощь?
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33247163
О_В_Д
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброжелательный мессагерЯ думаю надо написать так
MESSAGEBOX("ВНИМАНИЕ! Вы собираетесь УДАЛИТЬ этот населенный пункт. Пожалуйста, подумайте еще раз, потом откиньтесь на спинку стула и
опять подумайте, сходите покурить-опять подумайте,
короче думайте и думайте, а ваще лучше админа позвать", 4+48,"Удаление населенного пункта" )

Главный прикольщик в детском саду? Здесь форум, а не чат Кроватка. Либо админа часто зовешь на помощь?
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33247165
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброжелательный мессагер
Я думаю надо написать так
Я думаю, что не перевелись еще балбесы на земле русской.
Не лопни от смеха, мальчик!
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33247191
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Лисонька
Если делать по уму, то прав ВладимирМ - сначала проверить возможность удаления а потом уже делать все дальнейшие операции. Потом анализировать код будет проще. Но если тебе хочется придерживатся своей схемы то просто заведи признак ошибки и включай его в своей процедуры обработки ошибок. Чтото вроде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
lnAnswer = MESSAGEBOX("ВНИМАНИЕ! Вы собираетесь УДАЛИТЬ этот населенный пункт. Пожалуйста, подумайте еще раз, прежде, чем нажать клавишу ДА.",  4 + 48 ,"Удаление населенного пункта" )
DO CASE
   CASE lnAnswer =  6 
   m.error=.F.
   DELETE IN пункт
   IF not m.error
      REPLACE пункт WITH ALLTRIM(STR(пункт.КодПункт, 6 , 0 )) IN пункт && Чтобы можно было опять внести в таблицу это же название
   ENDIF
   GO TOP 
   thisform.grПункт.Refresh 
   thisform.grПункт.SetFocus 
ENDCASE 

Код: plaintext
1.
2.
3.
4.
5.
IF ERROR()= 1539 
=MESSAGEBOX("Удаление невозможно - этот населенный пункт в данный момент используется в адресах клиентов!", 48 )
m.error=.T.
RETURN
ENDIF 
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33247200
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Burn
Сначала проверить возможность удаления а потом уже делать все дальнейшие операции. Потом анализировать код будет проще. Но если тебе хочется придерживатся своей схемы то просто заведи признак ошибки и включай его в своей процедуры обработки ошибок.
Благодарю. Вот этого - IF not m.error - я не знала. Эта команда значительно облегчает задачу. Но всетаки 2 вопроса:
1. Так ли ужасен и не по уму написан мой собственный код?
2. Так где же мне посмотреть про try и catch?
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33247603
Да ладно, че вы все такие важные, даже пошутить нельзя,
понимаешь...
Про Try дак можно хелп почитать, а если не судьба, то на
тебе перевод
(специально сам переводил чтоб грехи замалить перед вами :-)))

TRY...CATCH...FINALLY Command fox.orient-time.ru
Команда TRY...CATCH...FINALLY
См. Также
Commands | Exception Class | UserValue Property | VARTYPE( ) Function | ErrorNo Property | ERROR( ) Function | MESSAGE( ) Function | AERROR( ) Function | SYS(2018) - Error Message Parameter

Структура для обработки ошибок и исключений, которые могут произойти при выполнении блока кода. Подробности о структурной обработке ошибок приведены в документе Structured Error Handling.

TRY
[ tryCommands ]
[ CATCH [ TO VarName ] [ WHEN lExpression ]
[ catchCommands ] ]
[ THROW [ eUserExpression ] ]
[ EXIT ]
[ FINALLY
[ finallyCommands ] ]
ENDTRY
Параметры
TRY

Указывает начало структуры TRY...CATCH...FINALLY.

tryCommands

Расположение инструкций, в которых, на взгляд разработчика, могла бы произойти ошибка. При происхождении ошибки, Visual FoxPro сохраняет ссылку на объект Exception в переменной VarName в предложении TO VarName. Выполнение программы переходит к инструкциям CATCH. Если ошибка не происходит, выполнение программы переходит к блоку FINALLY.

CATCH

Указывает начало блока CATCH, который обрабатывает соответствующую ошибку. Вы можете использовать инструкцию CATCH без параметров. В этом случае инструкция будет оценена как соответствующая Истине, и будет выполнен код, размещенный в этой конструкции.

В случае, если ошибка произойдет в методе объекта, в коде, обрамленном блоком TRY, и выполнение кода вызовет исключение, будет вызвана соответствующая инструкция CATCH. Если метод, вызванный из блока TRY, вызывает ошибку, она будет обработана методом Error этого метода. Это поведение обусловлено тем, что другой метод, который был вызван непосредственно, может и не содержать структуру TRY...CATCH...FINALLY. Следующий пример иллюстрирует это поведение:

x=NEWOBJECT("myClass")
x.myMethod()

DEFINE CLASS myClass AS Session OLEPUBLIC
PROCEDURE myMethod
myMethod3() && обрабатывает ошибку метод Error.
TRY
THIS.myMethod2()
myMethod3() && обрабатывает ошибку конструкция CATCH.
CATCH TO oErr
? "Catch:",oErr.ErrorNo
FINALLY
ENDTRY
ENDPROC

PROCEDURE myMethod2
x=y && Переменной y не существует. Заработает метод Error. ENDPROC

PROCEDURE Error(nError, cMethod, nLine)
? "Error:",nError
ENDPROC
ENDDEFINE

PROCEDURE myMethod3
x = y
ENDPROC
TO VarName

Определяет содержимое дополнительной переменной памяти, в которой сохраняется ссылка на объект Exception, который создается автоматически при происхождении ошибки в блоке TRY. VarName должна быть простой переменной. Она не может быть объектной ссылкой или свойством.

Вы можете явно присвоить переменной VarName любое значение в структуре TRY...CATCH...FINALLY. Значение не изменится, пока не заработает другая инструкция CATCH, которая присвоит VarName значение NULL.

VarName может иметь локальную (local), глобальную (public), или частную (private) область видимости. Это зависит от того, как предварительно была объявлена переменная. Если VarName не была предварительно объявлена, она имеет частную область видимости. Созданный объект Exception имеет ту же самую область, что и переменная VarName. Когда переменная VarName выйдет из области видимости, объект Exception также будет освобожден из памяти.

Когда выполняется предложение CATCH TO VarName, Visual FoxPro передает ссылке VarName указатель на новый объект Exception, независимо от его предыдущей установки, хотя VarName сохраняет его область видимости. Содержание VarName всегда записывается поверх, независимо от того, на что ранее ссылалось предварительное значение переменной.

Если существует предложение WHEN, и оно равно .F., Visual FoxPro освобождает объект Exception из памяти и присваивает переменной VarName значение NULL. Вы можете проверять установки переменной VarName , используя функцию VARTYPE ().

WHEN lExpression

Определяет дополнительное выражение, которое будет обработано в случае, если программа сталкивается с инструкцией CATCH. Для дальнейшей работы, для перехода к catchCommands, выражение должно быть равно Истине (.T)..

Параметр lExpression может содержать ссылку на VarName объекта Exception. Соответственно, с ее помощью, Вы можете запросить данные об ошибке для ее соответствующей обработки.

catchCommands

Здесь помещается код инструкции CATCH.

THROW [ eUserExpression ]

Создает новый объект Exception, который будет передан инструкции CATCH. Параметр eUserExpression определяет выражение любого типа и определяет значение свойства UserValue объекта Exception. Обычно, предложение THROW в блоке CATCH,используется для передачи ошибки или исключения в вышестоящий обработчик ошибки. Вы можете передавать объект любого типа, так как свойство UserValue объекта Exception может хранить только объектную ссылку.

Когда Вы используете предложение THROW с eUserExpression, Visual FoxPro присваивает свойству ErrorNo объекта Exception значение 2071, которое соответствует ошибке «User Thrown Error (Ошибка 2071)». Если Вы опускаете eUserExpression, Visual FoxPro ищет ранее определенный объект Exception, если он существует, иначе, Visual FoxPro передает новый объект Exception со значением свойства ErrorNo равным 2071.

Примечание Вы должны стараться использовать параметр eUserExpression, который будет определять значение свойства UserValue объекта Exception, так как он позволит Вам использовать цепь объектов Exception. Для получения дополнительной информации о последовательных объектах Exception, см. раздел Example.

Если Вы не включаете eUserExpression, и предложение THROW передает объект Exception внешнему блоку TRY...CATCH, внешним блоком TRY...CATCH будет захвачен тот же самый объект Exception. Значения, возвращаемые функциями ERROR(), MESSAGE( ), и AERROR () не всегда могут быть достоверными, при использовании их в структурном обработчике исключений. Вместо них, Вы должны использовать объект Exception.

Вы можете вызвать THROW из любого блока кода в структуре TRY...CATCH...FINALLY. Вы не можете вызвать THROW от окна Command. Вы можете использовать THROW только в том коде, в котором существует обработчик ошибки для захвата исключения.

Предупреждение Вызов команды THROW вне структуры TRY...CATCH...FINALLY и без соответствующего обработчика ошибки заставит среду прервать выполнение вашей программы.

Если при вызове THROW из блока CATCH или FINALLY присутствует внешняя инструкция TRY...CATCH, Visual FoxPro передает переменной VarName, находящейся в предложении CATCH TO, объектную ссылку на объект Exception (который был сгенерирован переброшенным исключением). Если внешней инструкции TRY...CATCH нет, Visual FoxPro передает исключение в обработчик, назначенный ON ERROR или в метод ERROR, если они существуют; иначе, Visual FoxPro вызывает системный обработчик ошибки.

Замечание Передача инструкции THROW во внешнюю структуру TRY...CATCH...FINALLY, в выполняющемся приложении (Runtime applications), должна быть соответствующим образом выполнена (обернута).

Если Вы желаете повторно передать первоначальное (оригинальное) исключение, которое было захвачено предложением CATCH TO VarName, Вы можете вызвать THROW VarName.

Обратите внимание. Передачу первоначального исключения производит другой новый объект Exception, во внешней инструкции CATCH (которая имеет свойство UserValue, содержащее объектную ссылку на первоначальное исключение).

Visual FoxPro игнорирует любые инструкции THROW, появляющиеся в предложении CATCH WHEN eExpression.

Если THROW сталкивается с ошибкой при оценке выражения, Visual FoxPro передает ошибку обычным способом.

EXIT

Используется в TRY, CATCH, FINALLY для немедленного выхода из блока кода.

Если EXIT стоит в блоке TRY или CATCH, управление переходит к инструкции FINALLY, если она существует. Если EXIT стоит в блоке FINALLY или если FINALLY не существует, управление переходит к инструкции, следующей за ENDTRY.

FINALLY

Указывает начало блока FINALLY, который обычно используется для очистки любых ресурсов, задействованных блоком TRY, и который всегда будет выполнен кроме случаев использования команд CANCEL и QUIT.

Для получения дополнительной информации о командах, которые могут быть использованы в структуре TRY...CATCH...FINALLY, см. Structured Error Handling.

finallyCommands

Расположение инструкций кода в блоке FINALLY, которые будет выполнены, после того, как в блоке TRY не будет обнаружено никаких ошибок или будут выполнены инструкции в блоке CATCH.

ENDTRY

Указывает конец структуры TRY...CATCH...FINALLY. Каждая структура TRY...CATCH...FINALLY должна закончиться ключевым словом ENDTRY. Как и в других управляющих инструкциях Visual FoxPro, Вы можете использовать комментарии, предваренные двойным амперсандом (&&) после слова ENDTRY.

Если Вы забудете включить инструкцию ENDTRY в конец структуры TRY...CATCH...FINALLY, Visual FoxPro сгенерирует ошибку при компиляции вашего кода и этот блок не сможет работать в дальнейшем.

Замечания
Исключения, которые происходят в обработчиках исключений TRY...CATCH...FINALLY, устанавливают команду SET CONSOLE в значение ON. Для получения дополнительной информации, см. SET CONSOLE Command.

Вы не можете явно передавать выполнение программы конструкциям CATCH или FINALLY.

Visual FoxPro устанавливает область видимости переменных как в процедурах. То есть переменные, объявленные в блоке TRY, видимы в блоке FINALLY в пределах той же самой структуры TRY...CATCH...FINALLY. Однако, переменные во вложенной структуре, которые объявлены в блоках TRY, CATCH, или FINALLY, имеют локальную область видимости (local).

Вы не должны инициализировать переменные или использовать критически важный код в блоке TRY, потому что этот код может не заработать. Если ошибка происходит в специфической строке программы в блоке TRY, все последующие строки в блоке TRY не будут выполнены.

Любые ошибки, которые происходят в объекте при возникновении события Error, должны быть обработаны объектом, и не должны передаваться в подпрограмму ON ERROR или обработчику TRY...CATCH...FINALLY. Однако, для перехвата ошибки при возникновении события Error, Вы можете использовать структуру TRY...CATCH...FINALLY. Для получения дополнительной информации, см. Error Event.

Использование функции COMRETURNERROR () в блоке CATCH заканчивает всю дальнейшую обработку ошибок, и управление возвращается непосредственно клиенту Component Object Model (COM). Так что блок FINALLY не будет выполнен. Для получения дополнительной информации, см. COMRETURNERROR( ) Function.

Избегайте использовать команду SET TEXTMERGE TO MEMVAR в структуре TRY...CATCH...FINALLY, потому что, если в этой инструкции произойдет ошибка, переменная памяти будет потеряна.

Вы можете использовать SYS (2410), функцию Error Handler в вашем коде TRY...CATCH...FINALLY, чтобы определить направление действий, например, используя структуру DO CASE, в зависимости от типа обработчика, который обрабатывает исключение. Для получения дополнительной информации, см. SYS(2410) - Error Handler.

Вы можете использовать TRY...CATCH...FINALLY для обработки тех ошибок, которые происходят в меню и событиях таймера и в командах типа ON KEY LABEL, если структура должным образом обернута. Следующий пример иллюстрирует, как команда READ EVENTS сохраняет управление программой в пределах структуры TRY...CATCH...FINALLY для захвата события меню. Захват ошибки управляется позицией TRY...CATCH...FINALLY в стеке вызовов.

TRY
DO myMenu.mpr
DO FORM myForm
myForm.AddObject("tm1","mytimer")
READ EVENTS
CATCH TO oException
IF oException.ErrorNo = 1
ENDIF
FINALLY
CLEAR EVENTS
ENDTRY
Для получения дополнительной информации, см. READ EVENTS Command и ON KEY LABEL Command.

Visual FoxPro поддерживает функцию отладки Set Next Statement только в пределах отдельного блока кода. Например, при выполнении кода в блоке TRY, Вы можете использовать Set Next Statement только применительно к другой строке в пределах блока TRY. Вы не можете перейти к другой строке программы в блоке CATCH или FINALLY. Для получения дополнительной информации, см.Debugger Keyboard Shortcuts and Menus.

Visual FoxPro генерирует соответствующие сообщения при следующих условиях:

Несоответствие или внутренняя ошибка структуры TRY...CATCH...FINALLY.
Возникает не обрабатывающееся исключение.
В блоке TRY, CATCH, или FINALLY появляется недопустимая команда. Для получения дополнительной информации, см. Structured Error Handling.
Если пользователь передал ошибку.
Пример
Следующий пример иллюстрирует, как вложить инструкции TRY...CATCH, использовать предложение THROW, и обработать объект Exception.

LOCAL x AS Integer, y AS Integer, result AS Integer
LOCAL oErr AS Exception, oErr1 AS Exception
TRY
x = 1
TRY
USE nothing
GO TOP
y = nothing.col1
CATCH TO oErr
oErr.UserValue = "Сообщение вложенного CATCH: Не могу обработать"
?[: Вложенный Catch! (Не могу обработать передачу объекта oErr наверх)]
?[ Внутренний Объект Исключения: ]
?[ Error: ] + STR(oErr.ErrorNo)
?[ LineNo: ] + STR(oErr.LineNo)
?[ Message: ] + oErr.Message
?[ Procedure: ] + oErr.Procedure
?[ Details: ] + oErr.Details
?[ StackLevel: ] + STR(oErr.StackLevel)
?[ LineContents: ] + oErr.LineContents
?[ UserValue: ] + oErr.UserValue
THROW oErr
FINALLY
?[: Выполняется вложенный FINALLY]
IF USED("nothing")
USE IN nothing
ENDIF
ENDTRY
result = x-y
CATCH TO oErr1
?[: Внешний CATCH! ]
?[ Внешний объект Exception: ]
?[ Error: ] + STR(oErr1.ErrorNo)
?[ LineNo: ] + STR(oErr1.LineNo)
?[ Message: ] + oErr1.Message
?[ Procedure: ] + oErr1.Procedure
?[ Details: ] + oErr1.Details
?[ StackLevel: ] + STR(oErr1.StackLevel)
?[ LineContents: ] + oErr1.LineContents
?[ ->UserValue становится внутренним исключением THROWn во вложенном TRY/CATCH ]
?[ Error: ] + STR(oErr1.UserValue.ErrorNo)
?[ Message: ] + oErr1.UserValue.Message
?[ Procedure: ] + oErr1.UserValue.Procedure
?[ Details: ] + oErr1.UserValue.Details
?[ StackLevel: ] + STR(oErr1.UserValue.StackLevel)
?[ LineContents: ] + oErr1.UserValue.LineContents
?[ UserValue: ] + oErr1.UserValue.UserValue
result = 0
FINALLY
?[: Инструкция FINALLY выполнилась ]
ENDTRY
RETURN result
Следующий пример показывает, как Вы могли бы работать с цепочкой объектов Exception:

TRY
TRY
x=y && Переменная Y не существует и потому вызывает ошибку.
CATCH TO oException2
THROW CREATEOBJECT("myException")
ENDTRY
CATCH TO oException1
ENDTRY

? 2, oException2.ErrorNo, oException2.UserValue
? 1, oException1.ErrorNo, oException1.UserValue.UserValue

DEFINE CLASS myException AS Exception
UserValue = "Мой персональный обработчик ошибки"
PROCEDURE Init
STRTOFILE("Ошибка произошла в: " + TRANSFORM(DATETIME());
+ CHR(13),"c:\errs.log",.T.)
ENDPROC
ENDDEFINE
См. Также
Commands | Exception Class | UserValue Property | VARTYPE( ) Function | ErrorNo Property | ERROR( ) Function | MESSAGE( ) Function | AERROR( ) Function | SYS(2018) - Error Message Parameter




--------------------------------------------------------------------------------

Send feedback on this topic to Microsoft

For technical support and product issues, see the "Microsoft Visual FoxPro Technical Support" topic..

© 1992 - 2003 Microsoft Corporation. All rights reserved.

fox.orient-time.ru
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33249258
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лисонька
Если это вне логики, то почему работает?
Благодарю.

А ты смотри что именно происходит, по твоей логике:

-) DELETE - здесь произошла ошибка
-) FoxPro переходит к событию, которое должно обрабатывать ошибки. В данном случае - это Error Event этой же кнопки.
-) Если событие Error заканчивается простой командой RETURN, то выполнение кода возвращается в ту процедуру, где произошла ошибка и переходит на следующую команду
-) Если в событии Error дается команда RETURN TO MASTER, то это означает возврат не в ту процедуру, где дана команда DELETE, а в главный стартовый файл проекта . Т.е. не просто прекращается действие процедуры, где дана команда DELETE, но напрочь "обрубается" вся дальнейшая обработка! Во всей цепочке вложенных процедур, последняя из которых и вызвала ошибку.

Если у тебя только одна процедура (в данном случае - событие Click), то можно и так. Но, в общем случае, если у тебя была целая цепочка вызываемых друг из друга процедур, то это не есть хорошо.

Ну, простейшая ситуация - главная и подчиненные таблицы. Удаляешь запись из главной, а внутри этой процедуры запускаешь процесс удаление из подчиненной. Во вложенной процедуре ошибка. По твоей логике ты уже не возвращяешся в процедуру удаления записи в главной таблицы. Просто прекращяешь работу процедуры удаления!
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33249529
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПро Try дак можно хелп почитать, а если не судьба, то на тебе перевод
Благодарю. Только вот просила я просто указать, где искать топик по этим командам, потому что простой поиск этих слов к желанному результату не приводит.
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33249530
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМНапрочь "обрубается" вся дальнейшая обработка! Во всей цепочке вложенных процедур, последняя из которых и вызвала ошибку. Если у тебя только одна процедура (в данном случае - событие Click), то можно и так. Но, в общем случае, если у тебя была целая цепочка вызываемых друг из друга процедур, то это не есть хорошо.
Теперь согласна с Вашими доводами, Учитель. Эту форму обкатываю вне самого проекта, вставлю в проект потом. А наверно зря так поступаю.
Благодарю
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33249539
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Лисонька
>1. Так ли ужасен и не по уму написан мой собственный код?
Он не ужасаен. Просто подобные конструкции очень затрудняют последующий анализ кода при соправождении программы - так как прейдется перелопатить кучу текста, чтобы прнять где имено изменятся значение переменой.
Поэтому если есть возможность избежать таких конструкций то лучше избегать:)

>2. Так где же мне посмотреть про try и catch?
Я пас - для меня базовая VFP6. Там этого еще нет;)
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33249643
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BurnЯ пас - для меня базовая VFP6. Там этого еще нет;)
Так этого и в 8 Фоксе я не нашла.
Леди и джентельмены! Откуда прислан переведенный топик? Разъясните, пожалуйста, что это за "серетный" код у Фокса.
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33249685
Приветствую Лисонька
Вы уже на меня не обижаетесь , да??? :-)))))
По существу
Оператор Try введен именно в 8 версии,
плохо искали, и в хелп там все описано

этот перевод про try бездарно слизан
отдуда
http://fox.orient-time.ru/index.htm
там есть компилированный файл справки скачай

Вообще есть фоксклуб
тоже хорошая вещь, в поиске набери Try и узнаешь много интересного

Есть на фоксклубе такая хорошая штука как
Offforum
все ответы ты найдешь там и в инете не надо будет спрашивать,
потому что все вопросы идут по кругу
В оффлайн форуме есть и поиск и избранное и прочая
Посиди скачай и будет тебе счастье
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33249788
О_В_Д
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛисонькаТак этого и в 8 Фоксе я не нашла.
Лисонька
Либо Вы неправильно пишите синтаксис этих команд либо смотрите не 8 VFP. Бывает, когда запаришься
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33249904
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мадам, советую Вам сменить работу. Думаю, что в другой области у Вас получится лучьше. Парадаксальный тупеж - это что-то новое на канале VFP.
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33250020
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
М-мд-я-я... Где же пресловутый Борман (он же в бытность свою просто Бендер)? Вот когда он смог бы оторваться по полной программе в "Половом вопросе" на счет женщин. Действительно, на рабочем столе рядышком иконки 7 и 8 Фокса. В 7-то я и искала TRY и CATH.
Благодарю.

P.S.
авторМадам, советую Вам сменить работу. Думаю, что в другой области у Вас получится лучьше. Парадаксальный тупеж - это что-то новое на канале VFP.
Хотя заместо Бормана сойдет и Luser.
Уважаемый Luser (не знаю, чего вы подразумевали под своим ником: loser - проигравший, нестоящая вещь, дрянь, неудачник; или Вы любитель Люсь?).
Так вот, у-ый Luser, парадоксальный тупеж у Вас в области русского языка, это точно. Мой совет Вам: ЛЧЬШЕ УЖЬ САВСЕМ НИПИШИТЕ Ф ФОРУМ, А ТО ХТО НИБУДЬ ДА ПОДУМАЕТ ШТО Luser ХОТЬ И СИЛЕН В ФОКСЕ, НО В ОСТАЛЬНОМ СЛАБ И НЕСОСТАЯТЕЛЕН
...
Рейтинг: 0 / 0
Опять про RETURN и CANCEL - что лучше?
    #33250023
О_В_Д
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лисонька, не оскорбляйте москвичей-loserov, они ж самые крутые здесь и везде!
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Опять про RETURN и CANCEL - что лучше?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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