Вопрос про "Local Error"

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Вопрос про "Local Error"

Сообщение Yurich » 05.08.2003 (Вт) 4:13

Насколько я понял, в VB (в отличие от СИ) при вызове DX-овой процедуры не возвращается код ошибки. Прога при наличии таковой просто виснет. Иной раз в цикличном коде выловить ошибку трудно и на то уходит тьма времени.
В примерах от Мсофт я обратил внимание на строки типа On Local Error GoTo ... и On Local Error Resume Next, но как это должно работать (и в особенности относительно DX) не врубился.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 05.08.2003 (Вт) 8:44

Это смотря какие ошибки. У меня, например, попытка записи в вертекс-буффер за его границу может вызвать недопустимую операцию, а CreateDevice с параметрами, не поддерживающимися оборудованием, прекрасно ловится. А On Local Error в отличие от On Error, заканчивает свое действие на Exit Sub или End Sub.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 05.08.2003 (Вт) 23:54

Не совсем так! Декларация On Error внутри процедуры то же действует только внутри ее, никак не далее! Тут вопрос, собственно, не столько в том, чем отличаются On Error от On Local Error. Существуют еще какие-нибудь средства, для отлова этих самых ошибок? Например, есть процедура удаления фрейма из сцены. Процедура вызывается циклично. Первый вызов проходит благополучно, второй приводит к зависанию, т.к. фрейм в сцене уже не существует (потратил около двух часов, пока допер в чем дело). Не хочется вводить дополнительные поля данных для контроля наличия фреймов, да и не всегда это помогает.

Другой завалящий пример:

' деталь
Public Type Detail
DeleteFromScene As Boolean ' фрейм удален?
Frame As Direct3DRMFrame3
SP As D3DVECTOR ' исходная позиция детали
MB As D3DRMBOX ' минимумы и максимумы в боксе детали
End Type

Public Detal(1 To 25) As Detail

' Взять деталь в руки (удалить фрейм из сцены)
Public Sub TakeDetal(Number As Integer)
If MyHand.TakeDetail Then Exit Sub ' если в руках уже есть деталь, выход из SUB
With Detal(Number)
' просто убираем из сцены
If Not .DeleteFromScene Then
.DeleteFromScene = True
Scene.DeleteVisual .Frame
End If
End With
End Sub

Этот участок кода выдает номер объекта, на котрый направлен взор (работает благополучно, но выдает номер детали и после удаления фрейма)

For i = 1 To 25
With Detal(i)
If Vx > (.SP.x + .MB.Min.x) And Vx < (.SP.x + .MB.Max.x) And _
Vz > (.SP.z + .MB.Min.z) And Vz < (.SP.z + .MB.Max.z) And _
Vy > (.SP.y + .MB.Min.y) And Vy < (.SP.y + .MB.Max.y) Then
DetalView = i '
Exit For
Else
DetalView = 0
End If
End With
Next i

А этот благополучно виснет после процедуры удаления фрейма

For i = 1 To 25
With Detal(i)
If (Not .DeleteFromScene) And _
Vx > (.SP.x + .MB.Min.x) And Vx < (.SP.x + .MB.Max.x) And _
Vz > (.SP.z + .MB.Min.z) And Vz < (.SP.z + .MB.Max.z) And _
Vy > (.SP.y + .MB.Min.y) And Vy < (.SP.y + .MB.Max.y) Then
DetalView = i
Exit For
Else
DetalView = 0
End If
End With
Next i

Во втором случае добавлена проверка того самого поля (тип Bool).
Все остальные поля заполнены предварительно и для обеих случаев одинаковы.
Где кроется глюк, ума не приложу!

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 06.08.2003 (Ср) 1:16

Так вот, пока я жму клавишу на удаление фрейма в функцию TakeDetal успевает проскочить Number=0 (а такой детали не существует). Ошибка в общем-то банальна - "индекс вне диапазона", но VB находится под DX-режимом и ничего не сообщает, просто валится!!!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 06.08.2003 (Ср) 14:02

Я сильно не вникал, но есть одно предположение
пока я жму клавишу на удаление фрейма в функцию TakeDetal успевает проскочить Number=0
Возможно где-то нужно удалить лишний DoEvents (либо передвинуть). Чтобы пока удаление не отработает, эта процедура не пускалась.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 07.08.2003 (Чт) 1:53

Yurich:
Mikle, спасибо за совет! Касаемо описанной выше ошибки все решено.
Поскольку с отловом ошибок, как таковых, пока ничего не ясно предлагаю вернуться к теме 'Про де(В?Д?)ушку КЛАВУ'

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 10.09.2003 (Ср) 15:53

Ребята, я так и не понял, какая разница, если я напишу
On Error GoTo ErrorLabel
или
On Local Error GoTo ErrorLabel ?

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 10.09.2003 (Ср) 21:23

Можно смело предположить, что это два варианта синтаксиса одного и того же. Ни в Help-е, ни в BookOnline про Local Error нет ни слова.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.09.2003 (Пт) 9:07

ГЫ!
А ведь не задумывался никогда!
Заинтересовали! :)


Солюшен
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 12.09.2003 (Пт) 15:04

[quote="GSerg"]ГЫ!
А ведь не задумывался никогда!
Заинтересовали! :)

Хм!!! Тота же... Я тоже раньше не думал, до недавнего времени...


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

    TopList