Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 | 2 |

 

  Вопрос: On error Добавлено: 09.09.09 11:02  

Автор вопроса:  fifa36
Здравствуйте!
Поделитесь знанием как соглусуются различные on error в коде, до куда они действуют и т д.

Например:

sub mysub()
on error goto
on error resume next

metka:
end sub


После on error resume next, on error goto потеряет свою силу?

Ответить

  Ответы Всего ответов: 27  

Номер ответа: 1
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #1 Добавлено: 09.09.09 11:24
Правильно, если возникнет ошибка, то сработает только on error goto metka:, и строка on error resume next не будет иметь смысла, так как при ошибке и когда ошибки нет она не используется. Она будет иметь смысл только в том случае если метка будет стоять перед ней и строка on error resume next будет использоваться для отлова возникновения последующих ошибок а не 1.

Ответить

Номер ответа: 2
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #2 Добавлено: 09.09.09 12:25
Вы знаете я вот поэксперементировал у меня после "on error resume next" "on error goto metka" как бы отключился и после ошибки он стал на след. строчку переходить несмотря на то что метка стоит после "on error resume next".

Ответить

Номер ответа: 3
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #3 Добавлено: 09.09.09 12:29
В чем проблема?

  1. sub mysub()
  2. on error goto metka
  3.    on error resume next
  4.    'здесь начал после ошибки переходить на след строку
  5. metka:
  6.    on error resume next
  7.    'А вот здесь почему то выдает сообщение об ошибки при закрытии файла с пустым filenumber
  8.    Close #filenumber
  9. end sub

Ответить

Номер ответа: 4
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #4 Добавлено: 09.09.09 12:29
В чем проблема?

  1. sub mysub()
  2. on error goto metka
  3.    on error resume next
  4.    'здесь начал после ошибки переходить на след строку
  5. metka:
  6.    on error resume next
  7.    'А вот здесь почему то выдает сообщение об ошибки при закрытии файла с пустым filenumber
  8.    Close #filenumber
  9. end sub

Ответить

Номер ответа: 5
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #5 Добавлено: 09.09.09 12:36
блин ваще бред теперь
  1. sub mysub()
  2. for k=1 to 10
  3.    on error goto metka
  4.  
  5.       on error resume next
  6.       'здесь НАЧАЛ выдавать ошибки
  7. metka:
  8.    on error resume next
  9.    'А вот здесь почему то выдает сообщение об ошибки при закрытии файла с пустым filenumber
  10.    Close #filenumber
  11. next k
  12. end sub

Ответить

Номер ответа: 6
Автор ответа:
 GDK



Вопросов: 13
Ответов: 348
 Профиль | | #6 Добавлено: 10.09.09 11:23
  1.  
  2.  
  3.  
  4. Sub mysub()
  5.  
  6.    On Error GoTo metka
  7.     A = CLng("999") 'выражение.
  8. '    A = CLng("999р") 'Косячное выражение. Будет переход к метке и остальные всякие онерроры перестанут работать если раскомментировать
  9.  
  10.       On Error Resume Next
  11.       A = CLng("999jjjj") 'Косячное выражение. Выполнено не будет т.к. до этого уже был переход к метке
  12.       ' Fifa 36:   здесь НАЧАЛ выдавать ошибки
  13.     On Error GoTo 0
  14.     On Error GoTo metka2
  15.     A = CLng("999jjjj") 'Косячное выражение. Выполнено не будет т.к. до этого уже был переход к метке
  16.       
  17. metka:
  18.     Debug.Print ("Переход на metka:")
  19.     On Error GoTo 0 'Если переход произошёл в результате отлова ошибки то
  20.     On Error GoTo metka2 'это не сработает
  21.     On Error Resume Next 'это тоже
  22. '   On Error Resume Next
  23.    ' Fifa 36:   А вот здесь почему то выдает сообщение об ошибкЕ при закрытии файла с пустым filenumber
  24.    Debug.Print (CLng("999jjjj")) 'Косячное выражение. Будет выдавать окно с сообщ.об ошибке если до этого уже была ошибка
  25. metka2:
  26.     Debug.Print "Переход на metka2:"
  27.     
  28. End Sub
  29.  
  30. Sub mysub1()
  31.  
  32. On Error Resume Next
  33. Rem Пофиг на все ошибки
  34. A = CLng("999р") 'Косячное выражение.
  35. A = CLng("999р") 'Косячное выражение.
  36. A = CLng("999р") 'Косячное выражение.
  37. Debug.Print (CLng("999jjjj")) 'Косячное выражение.
  38. A = CLng("999") ' выражение.
  39.  
  40.  
  41.  
  42. On Error GoTo 0
  43. Rem За все ошибки в дыню
  44. 'Debug.Print (CLng("999jjjj")) 'Косячное выражение. Будет выдавать окно с сообщ.об ошибке если раскомментировать
  45.  
  46. On Error Resume Next
  47. Rem Пофиг на все ошибки
  48. Debug.Print (CLng("999jjjj")) 'Косячное выражение.
  49.  
  50. End Sub



Разбирайся.

Вывод: Получается, что при использовании on error goto metka необходимо чтобы в коде обработки ошибок не было ещё ни одной ошибки.

Ответить

Номер ответа: 7
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #7 Добавлено: 10.09.09 13:02
Ок! Спасибо буду разбираться! А как же тогда в цикле обрабатывать одну и ту же ошибку? При первом появлении ошибки goto срабатывает а на следующих итерациях если возникнет опять ошибка, то она вылезает! как быть??

Ответить

Номер ответа: 8
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #8 Добавлено: 10.09.09 15:38
Да никак, гугли чтиво, читай и вникай, щас название непомню давно это было.
Это у тебя ещё ерунда, всё в одной процедуре, а ведь обработчик и на подпроцедуры действует.
Короче, в вба/вб6 нет вменяемой обработки ошибок :-)

Ответить

Номер ответа: 9
Автор ответа:
 GDK



Вопросов: 13
Ответов: 348
 Профиль | | #9 Добавлено: 10.09.09 18:25
Smith пишет:
Короче, в вба/вб6 нет вменяемой обработки ошибок

Потому я стараюсь не пользоваться этим. Максимум On Error Resume Next, On Error GoTo 0.
fifa36, давай код нормальный, подробный, с комментами - что хотелось бы видеть. Тогда можно будет подумать как реализовать. А так непонятно что требуется. И ещё учись писать легко читаемый, понятный, легко модифицируемый код.
PS Думать надо ПОБОЛЬШОМУ (:

Ответить

Номер ответа: 10
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #10 Добавлено: 11.09.09 14:21
Ну вот мне надо следующее: ечли ошибка при открытии файла то идти к следующему файлу, если же дошел до записи строки по полям где у меня On Error Resume Next то если не смог записать поле то чтобы шел на следующую строчку
  1.  
  2. sub my_sub()
  3.     for k=1 To nFile 'Цикл по файлам
  4.     on error goto next_file
  5.     Open filename For Input As #filenumber 'Открывает csv файл,
  6.  
  7.     On Error Resume Next
  8.     For Each fieldItem In fieldItems ' Записывает по полям в рекордсет
  9.         If splitedText(j - 1) = "" Then
  10.             fieldItem.Value = Null
  11.         Else
  12.             Select Case fieldItem.Type
  13.             Case 4 'Long
  14.                 fieldItem.Value = CLng(splitedText(j - 1))
  15.             Case 7 'Double
  16.                 fieldItem.Value = CDbl(splitedText(j - 1))
  17.             Case 8 'Date
  18.                 fieldItem.Value = CDate(splitedText(j - 1))
  19.             Case 10 'String
  20.                 fieldItem.Value = CStr(splitedText(j - 1))
  21.             Case 12 'MEMO
  22.                 fieldItem.Value = CStr(splitedText(j - 1))
  23.             End Select
  24.         End If
  25.         j = j + 1
  26.     Next fieldItem
  27. next_file:
  28.     next k
  29. end sub

Ответить

Номер ответа: 11
Автор ответа:
 GDK



Вопросов: 13
Ответов: 348
 Профиль | | #11 Добавлено: 11.09.09 20:29
Так. Для начала лучше вынести открытие файла в отдельную процедуру, записывание в рекордсет в другую отдельную процедуру.

В процедуре открытия пишешь обработчик ошибки, эта процедура(кстати она должна фанкцией быть) должна вернуть Труе при успешном открытии или фалзе при ошибке. В зависимости от этого код в цикле будет выполнять процедуру записи в рекордсет либо ни фига не делать или делать Debug.Print "Ошибка открытия файла" & filename. В процедуре записи в рекордсет тоже можно предусмотреть обработчик ошибок и возврат чего нибудь в зависимости от наличия ошибки.

Если нужно высокое быстродейтвие то передавай параметры в виде глобальных переменных, а не в виде аргументов функции.

Сделаешь сам? Думаю да. В понедельник гляну в тему, но не обещаю. Но тут много добрых людей. Если чё помогут.

Это был один из вопросов показывающих как логика программы может быть ограничена тем что в VB плохо продумана обработка ошибок.
Учись делить код на несколько мелких процедур и почувствуешь удобство и сократится время на рутину. Думаю профессионалы согласятся со мной. Напоминаю про возможность применять ООП в VB, не думаю что просидишь долго только на VB, а начальные знания ООП пригодятся в др. языках - высказывание на суд профессионалам.

Ответить

Номер ответа: 12
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #12
Добавлено: 12.09.09 00:07
GDK пишет:
PS Думать надо ПОБОЛЬШОМУ (:

ПОБОЛЬШОМУ другое делают. Хотя, если разницы нет... :)
PS: Я шутю :)

Ответить

Номер ответа: 13
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #13 Добавлено: 14.09.09 09:12
GDK спасибо за советы! думаю сделаю сам!) А к чему ты говоришь про "ООП"? Это объектно ориентированное программирование? Как оно помогло бы здесь? Кстати кто знает почему на форуме нет поиска?? Оч неудобно( А еще скажите пару слов что такое VB. NET?

Ответить

Номер ответа: 14
Автор ответа:
 GDK



Вопросов: 13
Ответов: 348
 Профиль | | #14 Добавлено: 14.09.09 10:32
ООП помогло бы ваще, не только здесь, будет удобнее писать, как следствие будет меньше ошибок. Во многих случаях будет проще модифицировать код, исправлять ошибки. Поиск есть. Только в стиле "через зад", да простят меня модераторы, но факт есть факт. Заходишь в форум, кликаешь любую тему, находишь окно, в котором обычно пишешь ответ, под кнопкой "Сохранить" найдешь что хотел.

Ответить

Номер ответа: 15
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #15 Добавлено: 14.09.09 12:42
GDK пишет:
Если нужно высокое быстродейтвие то передавай параметры в виде глобальных переменных, а не в виде аргументов функции.

Каким образом в VBA это может сказаться на быстродействии хотя бы сколько-нибудь ощутимо?

GDK пишет:
Это был один из вопросов показывающих как логика программы может быть ограничена тем что в VB плохо продумана обработка ошибок.

Готовься, сейчас кто-то тебя закидает шишками :)

А еще скажите пару слов что такое VB. NET?

http://en.wikipedia.org/wiki/Visual_Basic_.NET
На данный момент это единственная реализация языка Basic, которую есть смысл изучать

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам