Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработать ошибки / 25 сообщений из 28, страница 1 из 2
14.05.2008, 10:47
    #35310881
Андрюхец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
Привет народ
как нормально обрабатывать ошибки
в моей программе взде стоит обрабока ошибок
результаты обработки просто ссобщения
и почемуто 100 раз она отрабатывает ошибку нормально а на 101 выдает критическую
как можно гасить любую возникающую ошибку в приложении или это невозможно?
...
Рейтинг: 0 / 0
14.05.2008, 10:50
    #35310901
ДмиДми
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
Ничего невозможного нет.
On Error Resume Next
- "ибудит тибе щасте".

Но не слишком ли большой будет эта радость?
...
Рейтинг: 0 / 0
14.05.2008, 10:53
    #35310915
Андрюхец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
это можно применить только к канкретному куску текста а не к приложению в целом
этого у мя и так хватает
а вот как бы реально защитить приложение от сбоев
...
Рейтинг: 0 / 0
14.05.2008, 17:38
    #35312589
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
отладить его.
...
Рейтинг: 0 / 0
14.05.2008, 20:24
    #35312980
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
" ...результаты обработки просто ссобщения ..." Просто сообщений недостаточно, нужно как-то реагировать еще, например, вызывать одни модули и не вызывать другие. И посмотри опции в Tools/General/Error Trapping. И самое главное: избавься от On Error Resume Next.
...
Рейтинг: 0 / 0
14.05.2008, 21:07
    #35313029
ДмиДми
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
VladConnсамое главное: избавься от On Error Resume NextПожалуй, я бы не был столь категоричен.

Инструкция полезная, а во многих случаях - необходимая (можно даже через пробел: "не обходимая").
Главное - не забывать после неё правильно поставить On Error GoTo ...
...
Рейтинг: 0 / 0
14.05.2008, 22:21
    #35313120
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
:0)

Любопытно взглянуть на примеры "необходимая" и "не обходимая"!
...
Рейтинг: 0 / 0
14.05.2008, 22:45
    #35313166
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
Цитата из http://www.cpearson.com/excel/ErrorHandling.htm:

A Note Of Caution

...It is tempting to deal with errors by placing an On Error Resume Next statement at the top of the procedure in order to get the code to run without raising an error. This is very bad coding practice. Remember that using On Error Resume Next does not fix errors. It merely ignores them...

Я знаю, что люди в принципе используют (я бы сказал, что это даже популярно) On Error Resume Next в сочетании с CommonDialog и его свойством CancelError, а также в событии Form_Resize (классика), но обязательно ли это? Это в определенных случаях помогает сократить код, но подход в целом опасен, так как прячет проблему, а вот всегда ли мы лезем в Err, чтобы ее оттуда извлечь?
...
Рейтинг: 0 / 0
14.05.2008, 23:22
    #35313216
ДмиДми
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
VladConnЛюбопытно взглянуть на примеры "необходимая" и "не обходимая"!Ну, коли любопытно...

"Не обходимая" - например, при заполнении объекта типа Collection значениями с попутным контролем уникальности. Может быть, кроме отключения (resume next) и последующей проверки err.number есть другой способ определить, что в коллекции нет члена с определённым значением ключа, но мне он неизвестен.

Насколько я знаю, ключ формируется один раз при добавлении в коллекцию очередного Item, и в дальнейшем по этому ключу можно извлекать элемент, но нет способа прочесть ключ элемента, извлеченного, скажем, в цикле For Each....

Вы знаете такой способ? Поделитесь, плииз :)


Другой (впрочем, не очень-то и другой) случай - поиск имени с определённой иерархией областей поиска. Вот пример из боевой программы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Property Get WsRange(ws As Worksheet, rngID As String, _
        Optional OnWsOnly As Boolean = False) As Range

    If Err Then Exit Property
    If ws Is Nothing Then Exit Property

    On Error Resume Next
    With ws
        Set WsRange = .Range(rngID)
        If Err Then Err.Clear Else Exit Property

        If OnWsOnly Then Exit Property

        Set WsRange = .Names(rngID).RefersToRange
        If Err Then Err.Clear Else Exit Property
        Set WsRange = .Parent.Names(rngID).RefersToRange
        If Err Then Err.Clear
    End With
End Property
Вы можете предложить более корректный вариант? Приму с благодарностью.
...
Рейтинг: 0 / 0
14.05.2008, 23:31
    #35313221
ДмиДми
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
Ч-чёрт, нет возможности редактировать...
Поправка: не поиск имени , а поиск диапазона по имени .
...
Рейтинг: 0 / 0
16.05.2008, 15:42
    #35317557
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
ДмиДми,

На первый вопрос ответить чрезвычайно легко: вы используете не тот объект. В вашем случае используют не Collection, а Dictionary, вот и все. Гвозди забивают молотком, а не плоскогубцами.
Пойду читать второй пример.

Успехов.
...
Рейтинг: 0 / 0
16.05.2008, 16:25
    #35317706
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
ДмиДми,

Насчет второго примера: Вы бы не могли пояснить, что вы на самом деле подразумеваете под rngID : Name или ID?

И для чего вы его передаете ByRef?
...
Рейтинг: 0 / 0
16.05.2008, 16:50
    #35317825
ДмиДми
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
VladConnВ вашем случае используют не Collection, а DictionaryВ данном конкретном случае Вы меня убедили: не "не_обходимо", а "необходимо", и даже "иногда необходимо".

P.S. Риторический вопрос к победителю: а всегда ли Вам захочется ради одного только метода Exists (без которого легко можно обойтись) подтягивать целую библиотеку и грузить в память ещё один очень даже немаленький объект?
...
Рейтинг: 0 / 0
16.05.2008, 17:01
    #35317866
ДмиДми
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
VladConnчто вы на самом деле подразумеваете под rngID : Name или ID?
И для чего вы его передаете ByRef?
1. Это всегда Name. В качестве побочного эффекта - может быть использована и привычная A1-адресация, но не используется.
2. Так оно исторически сложилось. А сейчас во всю дурь действует древнее правило "пока работает - не трожь!"
Имена относительно коротки, можно было бы и в самом деле передавать значение, но незачем возиться: этот код выполняется относительно редко и на быстродействие не влияет, объект с этим свойством только один - стало быть, и память особо не сэкономишь (если сэкономишь вообще).
...
Рейтинг: 0 / 0
16.05.2008, 17:03
    #35317872
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
VladConnДмиДми,

На первый вопрос ответить чрезвычайно легко: вы используете не тот объект. В вашем случае используют не Collection, а Dictionary, вот и все. Гвозди забивают молотком, а не плоскогубцами.
Пойду читать второй пример.

Успехов.

Но если очень хочется, то обойти все равно можно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Sub CommandButton1_Click()
    Dim objMyVBACollection As New VBA.Collection
    
    AddItemToCollection objMyVBACollection, "A", "1"
    AddItemToCollection objMyVBACollection, "B", "1"
    AddItemToCollection objMyVBACollection, "C", "1"
    AddItemToCollection objMyVBACollection, "D", "1"
End Sub

Private Sub AddItemToCollection(ByRef ioobjMyCollection As VBA.Collection, _
                                                          ByVal pstrItem As String, _
                                                          ByVal pstrKey As String)

    Static intKeyIncrement As Integer
    
    ioobjMyCollection.Add pstrItem, pstrKey & "_" & CStr(intKeyIncrement)
    intKeyIncrement = intKeyIncrement +  1 
    
End Sub

Успехов
...
Рейтинг: 0 / 0
16.05.2008, 17:09
    #35317898
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
ДмиДми VladConnчто вы на самом деле подразумеваете под rngID : Name или ID?
И для чего вы его передаете ByRef?
1. Это всегда Name. В качестве побочного эффекта - может быть использована и привычная A1-адресация, но не используется.


Спасибо, ДмиДми,

Тогда можно сказать следующее: переименуйте rngID в rngName, ID - это что-то для линкованных рангов, по-моему, имя переменной вводит в заблуждение и напрягает. И наконец: зачем вообще потребовалось делать иерархический поиск имени ранга, если все равно все имена рангов внутри данной книги уникальны? Ну так и ищите сразу по всей книге одной строкой, и не надо тогда On Error Resume Next.

Успехов.
...
Рейтинг: 0 / 0
16.05.2008, 17:23
    #35317953
ДмиДми
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
VladConnAddItemToCollectionТакой способ добавления не сопровождается контролем уникальности pstrItem.
VladConnзачем вообще потребовалось делать иерархический поиск имени ранга, если все равно все имена рангов внутри данной книги уникальны?Нет. Есть идентичные имена уровня листа (на многих листах, и любое из них может отсылать к диапазону как "своего", так и другого листа) и уровня книги.
...
Рейтинг: 0 / 0
16.05.2008, 17:39
    #35318007
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
Уникальность Item? Вы об этом не упоминали, и Collection - не тот объект, он не требует уникальности Item. Вы показывали проблему уникальности ключа. И в случае с Item не требуется, кстати, On Error Resume Next, т.к. ошибки не возникает.

Успехов
...
Рейтинг: 0 / 0
16.05.2008, 17:41
    #35318012
ДмиДми
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
Sorry, не ответил сразу.
VladConnпереименуйте rngID в rngName, ID - это что-то для линкованных ранговТак оно и есть. Excel в данном случае работает в паре с Access'ом, и в Аксе rngId используется для линковки.
...
Рейтинг: 0 / 0
16.05.2008, 17:53
    #35318036
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
" ...Нет. Есть идентичные имена уровня листа (на многих листах, и любое из них может отсылать к диапазону как "своего", так и другого листа) и уровня книги. "

Если вас не затруднит, покажите способ создания неуникальных имен рангов: звучит странно. Пока я не увижу, что это на самом деле возможно: два разных ранга с одним и тем же именем, я не смогу согласиться с вашим "Нет." А если увижу, то тогда посмотрю, как можно обойти On Error Resume Next.

Я подозреваю, что вы смешиваете понятия диапазона клеток и ранга.

Успехов
...
Рейтинг: 0 / 0
16.05.2008, 18:01
    #35318055
ДмиДми
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
VladConnУникальность Item? Вы об этом не упоминали, и Collection - не тот объект, он не требует уникальности ItemРазве не упоминал? ДмиДми при заполнении объекта типа Collection значениями с попутным контролем уникальности Уникальности же требует не объект Collection, её требую я.
Я строю составной индекс, и ключ - функция нескольких свойств объекта, ссылка на который заносится в коллекцию.

Повторение ключа недопустимо, но возможно, так как линкуемые таблицы приходят от неподвластных мне балбесов-операторов. Поэтому одна из первых задач - обнаружить и ликвидировать повторения значений ключа, вызванные ошибками во входных данных.
...
Рейтинг: 0 / 0
16.05.2008, 18:06
    #35318069
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
ДимДим, вы говорили о проблеме уникальности ключа, а не Item.

Требование уникальности Item - не VB-шное, а значит и oшибка не генерируется, а значит и On Error Resume Next не потребуется.
...
Рейтинг: 0 / 0
16.05.2008, 18:08
    #35318073
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
VladConnЕсли вас не затруднит, покажите способ создания неуникальных имен рангов: звучит странно. Пока я не увижу, что это на самом деле возможно: два разных ранга с одним и тем же именем, я не смогу согласиться с вашим "Нет." А если увижу, то тогда посмотрю, как можно обойти On Error Resume Next.Вы про Эксель?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Sub add_name(sheet_name As String)
    Worksheets(sheet_name).Names.Add Name:="aaa", RefersTo:=Worksheets(sheet_name).Range("A1")
    Worksheets(sheet_name).Range("B2") = "=aaa"
    Worksheets(sheet_name).Range("aaa") = sheet_name
End Sub

Sub start_here()
    ' создаем
    add_name ActiveSheet.Name
    Worksheets.Add
    add_name ActiveSheet.Name
    Worksheets.Add
    ActiveSheet.Range("B2") = "=aaa"

    ' убеждаемся
    Worksheets("Sheet1").Activate
    Debug.Print Application.Range("aaa")
    Worksheets("Sheet2").Activate
    Debug.Print Application.Range("aaa")
    Worksheets("Sheet3").Activate
    Debug.Print Application.Range("Sheet1!aaa")
    Debug.Print Worksheets("Sheet1").Range("aaa")
    Debug.Print Application.Range("aaa")
End Sub
...
Рейтинг: 0 / 0
16.05.2008, 18:20
    #35318109
ДмиДми
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
VladConnПока я не увижу, что это на самом деле возможно: два разных ранга с одним и тем же именем, я не смогуУвидев три, сможете? :) Их могло бы быть и больше при большем количестве листов.
...
Рейтинг: 0 / 0
16.05.2008, 18:27
    #35318127
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать ошибки
Я пошел в список имен и увидел только один ранг:

Код: plaintext
=Sheet3!$A$ 1 

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


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