2009-09-04 3 views
1

주 호출 프로 시저에서 오류 처리기를 사용하고 다른 프로 시저가 오류 처리기로 롤업하도록합니다.VB6 오류 전달

매번 오류를 해결해야합니까? 또는 End Sub에서 오류 처리기를 계속 진행하는 대신 Sub Subtitle을 종료해야합니까?

나는 첫 번째 오류를 발견했을 수 있으므로 다른 오류는 처리되지 않을 것이라고 읽었 기 때문에 묻습니다.

죄송합니다. 내가하는 말을 정말로 모르겠다.

감사합니다.

편집 : 이와 비슷한 형식입니다. 필요한가?

Public Sub SubA() 
On Error Goto ProcError 

    ' other code 
    MsgBox FuncA() 

ProcExit: 
    Exit Sub 

ProcError: 
    MsgBox Err.Description 
    Resume ProcExit 
End Sub 
+1

질문을 나타내는 코드를 게시하십시오. – bugmagnet

+0

샘플 코드와 같이 어디에서 오류를 지우시겠습니까? – shahkalpesh

+0

글쎄, 나는 "Resume ProcExit"이 Err.Clear와 같은 일을한다고 읽었다. 하지만 내가 게시 한 코드가 왜 그런가요? 왜 "ProcExit 재개"인가? 잘못을 치우려면? 동일한 프로 시저가 다음의 잠재적 인 오류를 처리 할 수 ​​있도록? –

답변

2

영업 : 매번 오류를 해결해야합니까? 또는 End Sub에서 오류 처리기를 계속 진행하는 대신 Sub Subtitle을 종료해야합니까?

오류를 삭제하면 무엇을 의미합니까?
일반적으로 절차는 이러한 방식으로

public sub myProcedure() 
on error goto e: 
'statements that could raise error 
exit sub 

e: 
Log err.Number, err.Description, "error occurred in myProcedure" 
end sub 

또는

오류 처리기를 추가하지 않도록 선택할 수로 작성되었습니다. 이 경우 오류는 호출자 (또는 처리되는 프로 시저)로 전달됩니다.

& 귀하의 기대치를 달성하고자하는 샘플 코드를 게시하십시오.

편집 : 여기 당신이 게시 한 코드는 특정 예와

Public Sub SubA() 
On Error Goto ProcError 

    ' other code 
    MsgBox FuncA() 
exit sub 'put exit sub otherwise it will execute the line below, even if no error 

ProcExit: 
'this statement will get executed after the error msgbox is shown 
msgbox "Reached ProcExit" 
Exit Sub 

ProcError: 
MsgBox Err.Description 'catch the error and show the msgbox 
'error is cleared the point it reaches ProcError 
'Resume ProcExit acts as goto, to execute any statements after the error is handled 
Resume ProcExit 
End Sub 
+0

예가 있습니다.하지만 필요한지 알고 싶습니다. 오류를 해결하고 프로그램을 계속 실행하려면이 작업을 수행하십시오. 공용 서브 SubA() 오류 발생시 ProcError 오류 '다른 코드,있는 MsgBox FuncA() ProcExit : 종료 하위 ProcError : 있는 MsgBox 프로그램 Err.Description 다시 시작 ProcExit –

1

을 무엇을 의미하는지, 당신은 당신의 패턴이 오류를 잡기를 기반으로하기 때문에 오류를 지울 필요가 없습니다. 이 다치게하지 않지만 :

ProcExit: 
    Exit Sub 

ProcError: 
    MsgBox Err.Description 
    Err.Clear 
    Resume ProcExit 

을 이제 오류를 검사하는 대신 그들을 잡기 어디 패턴이 있다면, 다음 네, 당신은 그것을 취소해야 할 것이다. 다음은 작은 예입니다.

On Error Resume Next 
Dim o as Object 

Set o = myCollection(someKey) 

if Err.Number <> 0 then 
    ... respond to error 
    Err.Clear 

이 정보가 도움이되기를 바랍니다.

1

예상대로 (예 : 오류가 발생하지 않음) Sub를 종료 할 때마다 Err 개체가 지워집니다. 예제에서 Resume ProcExit 문은 필요하지 않습니다. 당신은 Err 개체를 지우려면 Exit Sub 문을 사용할 필요가 없습니다

Public Sub SubA() 
    On Error Goto ProcError 
    MsgBox FuncA() 
ProcExit: 
    Exit Sub 
ProcError: 
    MsgBox Err.Description 
    Resume ProcExit 
End Sub 

Public Sub SubA() 
    On Error Goto ProcError 
    MsgBox FuncA() 
    Exit Sub 
ProcError: 
    MsgBox Err.Description 
End Sub 

: 다음 두 잠수함은 같은 방식으로 작동합니다. 너가 End Sub를 명중 할 때 단순히 잠수함에서 떨어지는 것은 동일한 영향을 미친다.

"다른 프로 시저"의 오류를 기본 호출 프로 시저의 오류 처리기로 "롤업"(더 나은 단어가 전달됨)하려는 경우에는 오류 처리기가 포함되어서는 안됩니다. 예를 들어, Main이 SubA를 호출하고 SubA가 FuncA를 호출한다고 가정합니다. FuncA에서 오류가 발생합니다.예와 같이 메시지 상자를 표시하여 FuncA에서 오류를 처리하는 경우 코드는 SubA에서 계속 실행되지만 FuncA에서 문제가 발생하여 SubA가 알 수 없으므로 불안정한 상태가됩니다. 그것.

하나의 옵션은 오류 처리기를 SubA와 FuncA에 넣는 것을 삼가는 것입니다. FuncA에서 오류가 발생하면 SubA로 이동하여 SubA로 전달한 다음 Main으로 이동하여 올바르게 처리합니다.

더 나은 옵션은 오류를 트랩하고 로그 한 다음 다시 올리는 것입니다. 그런 다음 오류 처리기로 오류가 마침내 Main Sub에 도착하면 더 많은 정보를 얻을 수 있습니다.