Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Alex_47
Зарегистрирован: 01.07.2009 Сообщения: 66 Откуда: Н.Новгород
|
Добавлено: Вт Фев 02, 2010 7:47 pm Заголовок сообщения: Обработчик ошибок |
|
|
Здравствуйте!!! Подскажите, пожалуйста, почему вот так работает
________________________________________________________
Dim put_ As String
OnError GoTo no_states
Open Table "states"
no_states:
put_=FileOpenDlg("","","TAB","Открытие таблицы states ")
resume after_mapfrom
after_mapfrom:
OnError GoTo 0
...
End Program
________________________________________________________
А так уже нет
________________________________________________________
Dim put_ As String
OnError GoTo no_states
Open Table "states"
no_states:
put_=FileOpenDlg("","","TAB","Открытие таблицы states ")
Open Table put_
resume after_mapfrom
after_mapfrom:
OnError GoTo 0
...
End Program
________________________________________________________ |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Ср Фев 03, 2010 12:08 am Заголовок сообщения: |
|
|
было бы полезным озвучить что именно не работает или работает не так. |
|
Вернуться к началу |
|
|
Alex_47
Зарегистрирован: 01.07.2009 Сообщения: 66 Откуда: Н.Новгород
|
Добавлено: Ср Фев 03, 2010 7:55 pm Заголовок сообщения: |
|
|
Если при обработке ошибки стоит оператор OPEN TABLE, то насколько я понял таблица не открывается и выполнение программы переходит в начало, а не на метку и после этого выдает ошибку «Таблица states не найдена. Таблицу states открыть не удалось». А если не открывать таблицу то ошибки нет. |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Чт Фев 04, 2010 9:33 am Заголовок сообщения: |
|
|
Блок обработки ошибок ничем не отличается от любого другого блока программы. Исполнение идет обычным образом - команды сверху вниз, с ветвлением, циклами и прочим. Если попали в блок обработки ошибки, то надо обеспечить выход из него - т.е. поставить goto в предполагаемом конце блока обработки ошибки. В блоке обработки ошибки может возникнуть другая ошибка, предыдущий OnError на нее уже на распространяется, надо ставить новый или пойдет обработка по умолчанию (появится сообщение об ошибке). |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Чт Фев 04, 2010 10:44 am Заголовок сообщения: |
|
|
Уважаемый Alex_47!
Вам надо проблему решить или просто поговорить ;-)
Имеем уже два ваших поста, но так и не понятно к чему речь.
Как говорят умные люди, в правильно поставленном вопросе содержиться половина ответа, или примерно так...
Может лучше как в школьных задачках, да и не только в школьных, пойти по простому пути:
1. Дано
2. Найти/доказать
3. мой вариант решения/понимания
4. Вопрос к форуму
Чем больше исходной информации - тем лучше. Это как на приеме у врача.
Тогда любой человек спокойно поймет что за проблема и окажет посильную помощь, в крайнем случае задаст наводящие вопросы. Иначе можно погрязнуть в чтении и сборе обрывочных сведений из последующих постов... |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Чт Фев 04, 2010 1:02 pm Заголовок сообщения: |
|
|
Для начала, перед тем как задаваться сложными вопросами, вставляйте в непонятных местах проверку значения:
print "получили вот такой вот путь к таблице - " + put_
Что дает? А то может программа путь не получила, потому и открыть не может. А потом уже Open Table
Ппро обработчик:
при возникновении ошибки в коде после объявления блока обработчика OnError.. программа идет к метке, которая объявлена в GoTo, т.е. к no_states, причем эта метка должны быть расписана в конце процедуры, после выхода из нее (Exit Sub), там и происходит вывод сообщения об ошибке и завершение обработчика, может переход на другую метку. Типа того:
ExitSub:
OnError Goto 0
Exit Sub
no_states:
Note Error$()
Resume ExitSub
А в Вашем случае обработчик, кажется, выйти не может, все возвращается на диалог открытия таблицы.. |
|
Вернуться к началу |
|
|
Alex_47
Зарегистрирован: 01.07.2009 Сообщения: 66 Откуда: Н.Новгород
|
Добавлено: Чт Фев 04, 2010 8:36 pm Заголовок сообщения: |
|
|
1: Хочу открыть таблицу "states" - т.к. ее нет выполнение программы переходит на метку "no_states"
2: В обработчике ошибок хочу указать нужную таблицу при помощи "FileOpenDlg" возвратив имя файла в переменную put_
3: далее пытаюсь открыть таблицу именно тут и возникает проблема - открыть таблицу не получается
Вопрос: Почему не получается открыть таблицу из обработчика ошибок? |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Пт Фев 05, 2010 10:25 am Заголовок сообщения: |
|
|
Sub ..
Dim put_ As String
OnError GoTo no_states
put_ = "states"
after_mapfrom:
Open Table put_
OnError GoTo 0
...
Exit Sub
no_states:
put_=FileOpenDlg("","","TAB","Открытие таблицы states ")
resume after_mapfrom
End Sub |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Пт Фев 05, 2010 12:32 pm Заголовок сообщения: |
|
|
[quote="Alex_47"]
3: далее пытаюсь открыть таблицу именно тут и возникает проблема - открыть таблицу не получается
Вопрос: Почему не получается открыть таблицу из обработчика ошибок?[/quote]
А можно дословное сообщение об ошибке? ;-)
Может таблица уже открыта?
А может надо написать
open table put_ as States (т.е. принудительно задать алиас)?
Надо вдумчиво понять работу обработчиков, и понять причину ошибки неоткрытия выбираемой таблицы. и должно все заработать. |
|
Вернуться к началу |
|
|
Alex_47
Зарегистрирован: 01.07.2009 Сообщения: 66 Откуда: Н.Новгород
|
Добавлено: Пт Фев 05, 2010 6:43 pm Заголовок сообщения: |
|
|
reasonat писал(а): |
Sub ..
Dim put_ As String
OnError GoTo no_states
put_ = "states"
after_mapfrom:
Open Table put_
OnError GoTo 0
...
Exit Sub
no_states:
put_=FileOpenDlg("","","TAB","Открытие таблицы states ")
resume after_mapfrom
End Sub |
Вот так работать должно. Но, к сожалению, мне нужно, что бы таблица открывалась из «no_states:», а не «after_mapfrom:»:
Sub Main
Dim put_ As String
OnError GoTo no_states
Open Table "states"
put_ = "states"
after_mapfrom:
OnError GoTo 0
...
Exit Sub
no_states:
put_=FileOpenDlg("","","TAB","Открытие таблицы states ")
Open Table put_
resume after_mapfrom
End Sub
А так уже не работает только я еще добавил "Open Table "states"" чтобы перейти в no_states Попробуйте у себя отткомпилировать |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Пн Фев 08, 2010 11:52 am Заголовок сообщения: |
|
|
да у вас в другом проблема, в no-states процедура переходит, она не выполняет открытие таблицы с полученным адресом.
Говорю же, расставьте после каждого действия проверочные Print...
B почему, собственно открытие табилцы должно происходить именно из no_states, а не из after_mapfrom?
Пуще того, почему нельзя сразу явную проверку сделать, а не обработчиком:
Код: |
OnError GoTo no_tab_open
put_ = "...\states.TAB"
If FileExists(put_)
Then
Open Table put_
Else
Open Table FileOpenDlg("","","TAB","Открытие таблицы states ")
End If
...
after_mapfrom:
OnError GoTo 0
Exit Sub
no_tab_open:
resume after_mapfrom
End Sub
|
У вас получается просто много повторов. Путь к таблице задается разными строками, да попытка открытия - в разных местах, от этого что-то и не работает.
Вот так попробуйте и проверьте, куда у вас не заходит:
Код: |
no_states:
print "1: states не открылась"
put_=FileOpenDlg("","","TAB","Открытие таблицы states ")
print "2: теперь путь - " + put_
Open Table put_
print "3: сюда не доходит, а читает опять states"
|
|
|
Вернуться к началу |
|
|
|