powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Головная процедура не видит, что в вызываемых продурах err <> 0
9 сообщений из 9, страница 1 из 1
Головная процедура не видит, что в вызываемых продурах err <> 0
    #36352224
Добрый день!
Использую VB6 с опцией Break on all errors
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Command1_Click()
On Error GoTo err1

    вызываемая_процедура      ' ДОПУСТИМ У НЕЁ  Err.number <> 0

    Exit Sub
    
err1:
    MsgBox Err.Description
End Sub
не хотелось бы делать функцию, в связи с этим вопрос,
почему же Command1_Click не видит, что вызываемая процедура проработала с ошибкой
в ней то же есть on error и так далее

Спасибо.
...
Рейтинг: 0 / 0
Головная процедура не видит, что в вызываемых продурах err <> 0
    #36352241
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что Err сбрасывается при входе/выходе из процедур.

Либо используйте в обработчике RaiseError, либо делайте функцию - по-моему второй вариант гораздо приятнее.
...
Рейтинг: 0 / 0
Головная процедура не видит, что в вызываемых продурах err <> 0
    #36353245
Спасибо Shocker.Pro
А Вы не дадите примерчик как им пользоваться этим RaiseError

P.S.
такой вариант был бы удобным, но процедура Command1_Click не реагирует на ошибку
может быть покажете свои варианты
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Command1_Click()
On Error GoTo err1
    
    Err.Number = Create_temp_mdb()
...
    Exit Sub
err1:
    MsgBox Err.Description
End Sub
Спасибо.
...
Рейтинг: 0 / 0
Головная процедура не видит, что в вызываемых продурах err <> 0
    #36353428
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
невнимательный3Спасибо Shocker.Pro
А Вы не дадите примерчик как им пользоваться этим RaiseError

Кажется из SQL стащил не то
На самом деле не RaiseError, а Err.Raise
Почитайте хелп. Оно просто генерит ошибку, вы можете сгенерить ее в своей процедуре. Я с этим работал очень мало, потому без подробностей


невнимательный3такой вариант был бы удобным, но процедура Command1_Click не реагирует на ошибку
может быть покажете свои варианты. Спасибо.
Код: 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.
Private Sub Command1_Click()
    
    Dim ErrMsg As String, RetCode as Long
    RetCode=Create_temp_mdb(ErrMsg)
    If RetCode< 0  Then
        MsgBox ErrMsg
        Exit Sub
    End If
...............продолжение

End Sub

Private Function Create_temp_mdb(ByRef ErrMsg As String) As Long

Create_temp_mdb= 0 
On Error GoTo Err
.................
On Error GoTo  0 
Exit Function

Err:
Create_temp_mdb=- 1 
ErrMsg=Err.Description
On Error GoTo  0 
Exit Function

End Function

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

Код: 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.
Private Sub Command1_Click()
    
    Dim ErrMsg As String
    ErrMsg=Create_temp_mdb()
    If ErrMsg<>"" Then
        MsgBox ErrMsg
        Exit Sub
    End If
...............продолжение

End Sub

Private Function Create_temp_mdb() As String

Create_temp_mdb=""
On Error GoTo Err
.................
On Error GoTo  0 
Exit Function

Err:
Create_temp_mdb=Err.Description
On Error GoTo  0 
Exit Function

End Function
...
Рейтинг: 0 / 0
Головная процедура не видит, что в вызываемых продурах err <> 0
    #36353527
Благодарю Вас Shocker.Pro
...
Рейтинг: 0 / 0
Головная процедура не видит, что в вызываемых продурах err <> 0
    #36353574
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: невнимательный3

Я не совсем понял что у вас не так.
Например есть 2 процедуры, одна вызывается из другой и в вызываемой есть ошибка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Option Explicit

Private Sub Command1_Click()
On Error GoTo labErr
Call TestErrorHandler
Exit Sub
labErr:
MsgBox Err.Description
End Sub

Private Sub TestErrorHandler()
Dim d As Long
d =  2  /  0 
End Sub
В таком варианте ошибки в процедуре TestErrorHandler не обрабатываются и ошибка деления на ноль перехватится в процедуре
Command1_Click.
В случае когда в процедуре TestErrorHandler есть обработчик ошибок, в вызываемую процедуру можно передать факт
возникноверия ошибки двумя способами, сгенерировав нужную ошибку или вернуть значение указывающее на ошибку, например
практически все API функции возвращают значение или успех или неудача, В технологии СОМ стандартизированно возвращать
или вызов прошёл успешно или нет. И для этого есть свои причины. В С++ библиотеках используется выброс эксцепшина.
Пример когда при ошибке выталкивается исключение такой:
Код: 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.
Option Explicit

Private Sub Command1_Click()
On Error GoTo labErr
Call TestErrorHandler
Exit Sub
labErr:
Select Case Err.Number
Case vbObjectError +  1 
    MsgBox Err.Description
Case Else
    MsgBox Err.Description
End Select
End Sub

Private Sub TestErrorHandler()
On Error GoTo labErr:
Dim d As Long
d =  2  /  0 
' Здесь куча полезных действий
Exit Sub
labErr:
MsgBox Err.Description
Err.Raise vbObjectError +  1 , "TestErrorHandler", "Моя ошибка, которую нужно обработать специальным образом"
End Sub
Для реализации возврата неудачи через возвращаемое значение желательно организовать централизованное управление кодов
возврата ошибок.
Например в модуле написать следующее:
Код: 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.
28.
29.
30.
31.
Option Explicit

Public Const MY_OK =  0 
Public Const MY_BASE_ERROR = vbObjectError +  1000 

Public Const MY_DIV_BY_ZERO = MY_BASE_ERROR +  1 [src]
а в форме оформить так:
[src vba]Option Explicit

Private Sub Command1_Click()
Select Case TestErrorHandler
Case MY_DIV_BY_ZERO
    MsgBox "Произошло деление на ноль"
Case Else
    MsgBox "Что-то произошло"
End Select
End Sub

Private Function TestErrorHandler() As Long
TestErrorHandler = MY_OK
On Error GoTo labErr:
Dim d As Long
d =  2  /  0 
' Здесь куча полезных действий
Exit Function
labErr:
If Err.Number =  11  Then
    TestErrorHandler = MY_DIV_BY_ZERO
Else
    TestErrorHandler = MY_BASE_ERROR
End If
End Function
Ещё лучше в модуль добавить свой TYPE в котором можно было сохранять номер ошибки, текстовое описание, функцию, в
которой произошла ошибка, но это довольно хлопотно для маленьких проектов.

Вообщем как-так

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Головная процедура не видит, что в вызываемых продурах err <> 0
    #36353733
Понял, спасибо Игорь Горбонос. Идея ясна.
...
Рейтинг: 0 / 0
Головная процедура не видит, что в вызываемых продурах err <> 0
    #36354138
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
On Error GoTo  0 
Exit Function
On error Goto 0 в здесь ни на что не влияет, можно убрать.
Код: plaintext
1.
2.
3.
4.
5.
6.
Err:
Create_temp_mdb=- 1 
ErrMsg=Err.Description
On Error GoTo  0 
Exit Function

End Function
А здесь еще и не работает.
Ну и Exit Function лишняя. Видимо на всякий случай.

Зато в обработчик ошибок можно написать такую не особо документированную вещь как On Error Goto -1
При ее выполнении обработчик ошибок перестает им быть и в нем снова можно использовать On Error.
...
Рейтинг: 0 / 0
Головная процедура не видит, что в вызываемых продурах err <> 0
    #36354417
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyOn error Goto 0 в здесь ни на что не влияет, можно убрать.
Ну и Exit Function лишняя. Видимо на всякий случай.

Знаешь, я выработал привычку закрывать все открытое.
Например
RecSet.Close: Set RecSet=Nothing
Вроде необязательна вторая команда, а глюки были.

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


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