Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработка исключений / 15 сообщений из 15, страница 1 из 1
30.03.2011, 15:28
    #37190424
EmilRegis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
Здравствуйте. Сразу оговорюсь, я с вижлбейсиком раньше почти не сталкивался, но вот пришлось..

Порылся в интернете и такое впечатление, что нету в нём толковой обработки ошибок!!
То есть всё, что нашёл - это или
Код: plaintext
1.
2.
3.
4.
5.
6.
On Error Resume Next

...
Select case Err.Number

и дальше перебор кодов ошибок
или
Код: plaintext
1.
On Error GoTo Error1
То есть при ошибке посылаем к оставленной метке.
Но вот у меня задача в цикле выполнять определённые действия и при ошибке записывать эту ошибку, а если всё ок, то записывать результат выполнения функции.
Так вот, я не возьму в толк, как при такой обработке ошибок быть? Если оставить метку вне цикла, то при ошибке из цикла вылетает естественно, но нужно, чтобы цикл работал дальше.
Если использую Resume Next, то цикл отрабатывает, но обработки ошибок не происходит. Заранее скажу, что всех возможных кодов ошибок я не знаю и хотелось бы повесить один обработчик на любую возможную ошибку.

Как быть подскажите пожалуйста?
...
Рейтинг: 0 / 0
30.03.2011, 15:32
    #37190438
EmilRegis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
хм...разве что при ошибке посылать к метке вне цикла, там выполнять нужные действия, а потом посылать к метке в самом конце цикла...
Но кажется будто это как-то через одно место))
...
Рейтинг: 0 / 0
30.03.2011, 15:43
    #37190470
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
EmilRegisЕсли использую Resume Next, то цикл отрабатывает, но обработки ошибок не происходит.
В вашем случае логичнее использовать первый вариант, а почему "обработки ошибок не происходит" мы без приведения вашего кода не угадаем.
...
Рейтинг: 0 / 0
30.03.2011, 15:44
    #37190471
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
Shocker.ProEmilRegisЕсли использую Resume Next, то цикл отрабатывает, но обработки ошибок не происходит.
В вашем случае логичнее использовать первый вариант, а почему "обработки ошибок не происходит" мы без приведения вашего кода не угадаем.

Надо помнить, что Err.Number нужно анализировать СРАЗУ после возможной строки с ошибкой, иначе последующие выполняемые операции без ошибок сбрасывают его в 0
...
Рейтинг: 0 / 0
30.03.2011, 15:49
    #37190488
EmilRegis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
ну вот примерный код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Sub Main
  On Error GoTo Err
  Dim ResultSet,contxt,basa,Connection,Statement,InteractionHandler
  Dim n, i, sShow

  oSheet = ThisComponent.getSheets().getByIndex( 0 )
  contxt = CreateUnoService("com.sun.star.sdb.DatabaseContext")
  basa = contxt.getByName( "postgkh" )
  InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler") 
  Connection = basa.ConnectWithCompletion(InteractionHandler)
  Statement = Connection.CreateStatement
  i =  0 
  err =  0 
  for n =  1  to  100 
    i = i +  1 
 	oCell=oSheet.getCellByPosition( 1 ,n)
	ResultSet = Statement.executeQuery(oCell.String)
	WriteResult(ResultSet, i)
	nextstep:	
  next n
  Exit Sub
  Err: 
    oSheet2 = ThisComponent.getSheets().getByIndex( 1 )
	oCell=oSheet2.getCellByPosition( 1 ,i)
        oCell.String="Ошибка"
	GoTo nextstep
End sub
Если использовать первый вариант Resume Next, то там насколько я понял ошибки надо обрабатывать с помощью
Select Case Err.Number

End Select

но тут надо знать всевозможные коды ошибок. А мне надо один обработчик на все возможные ошибки повесить. Если использовать Resume Next без Err.Number, то ошибка просто пролетает и переходит к очередной итерации цикла
...
Рейтинг: 0 / 0
30.03.2011, 15:51
    #37190494
EmilRegis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
кстати в приведённом примере несмотря на обработчик, который я повесил, исключение вылетает на строчке
ResultSet = Statement.executeQuery(oCell.String)
если туда передаётся sql процедура с ошибочным числом параметров
...
Рейтинг: 0 / 0
30.03.2011, 15:53
    #37190501
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
EmilRegisно тут надо знать всевозможные коды ошибок.
Зачем?
Код: plaintext
If Err.Number<> 0  Then Msgbox Err.Descriptions
...
Рейтинг: 0 / 0
30.03.2011, 15:54
    #37190506
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
EmilRegisну вот примерный код
Код неверный, потому что возврат из обработчика ошибок должен осуществляться командой Resume, а не Goto
...
Рейтинг: 0 / 0
30.03.2011, 15:59
    #37190521
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
EmilRegis

в VB Tools-Option-General
для обработчика ошибки выбери последнее

может поможет при вызове sql
...
Рейтинг: 0 / 0
30.03.2011, 16:06
    #37190548
EmilRegis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
ага,спасибо добрые люди) попробую)
...
Рейтинг: 0 / 0
30.03.2011, 16:08
    #37190553
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
я бы как-то так сделал

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Sub Main
  'On Error GoTo Err
  Dim ResultSet,contxt,basa,Connection,Statement,InteractionHandler
  Dim n, i, sShow

  oSheet = ThisComponent.getSheets().getByIndex( 0 )
  contxt = CreateUnoService("com.sun.star.sdb.DatabaseContext")
  basa = contxt.getByName( "postgkh" )
  InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler") 
  Connection = basa.ConnectWithCompletion(InteractionHandler)
  Statement = Connection.CreateStatement
  i =  0 
  err =  0 
  for n =  1  to  100 
    i = i +  1 
 	oCell=oSheet.getCellByPosition( 1 ,n)
	On Error Resume Next
           ResultSet = Statement.executeQuery(oCell.String)
           If Err.Number <>  0  Then
             oSheet2 = ThisComponent.getSheets().getByIndex( 1 )
             oCell=oSheet2.getCellByPosition( 1 ,i)
             oCell.String="Ошибка"
           Else
             WriteResult(ResultSet, i)
           End If
        On Error GoTo  0 
  next n
End sub
...
Рейтинг: 0 / 0
30.03.2011, 16:08
    #37190554
basicv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
EmilRegisНо вот у меня задача в цикле выполнять определённые действия и при ошибке записывать эту ошибку, а если всё ок, то записывать результат выполнения функции.


В подобных случаях я поступал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub Main
  On Error GoTo Err
    ...
  Exit Sub
  Err: 
    MsgBox("Error")
    Resume Next
  End sub

...
Рейтинг: 0 / 0
30.03.2011, 16:31
    #37190633
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
Shocker.ProShocker.Proпропущено...

В вашем случае логичнее использовать первый вариант, а почему "обработки ошибок не происходит" мы без приведения вашего кода не угадаем.

Надо помнить, что Err.Number нужно анализировать СРАЗУ после возможной строки с ошибкой, иначе последующие выполняемые операции без ошибок сбрасывают его в 0 Откуда эта деза? Сбрасывает только err.clear или другой on error.
...
Рейтинг: 0 / 0
30.03.2011, 16:34
    #37190644
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
Shocker.Proя бы как-то так сделалМало. До цикла происходит куча объектных вызовов, любой из которых теоретически может завершиться ошибкой. В начале нужно on error goto.
...
Рейтинг: 0 / 0
30.03.2011, 17:01
    #37190727
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений
AntonariyShocker.Proя бы как-то так сделалМало. До цикла происходит куча объектных вызовов, любой из которых теоретически может завершиться ошибкой. В начале нужно on error goto.
Я дорабатывал код автора. Его код предполагает ошибку на выполнении запроса - ее я и отследил. Остальное сам додумает, после тех ошибок резюмирование явно не требуется, так как ошибки будут фатальными.

Насчет сброса кода ошибки... возможно я спутал с кое-чем еще. Проверять лень, верю на слово.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработка исключений / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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