'on error goto 0'과 'on error goto - 1'의 차이 -- VBA
VBA에서 'On error goto - 1'과 'On error goto 0'의 차이를 찾을 수 있는 사람이 있습니까?구글과 msdn을 시도해봤지만 운이 없었어요.
On Error GoTo 0
에 의해, 현재 프로시저에 존재하는 에러 트래핑을 무효로 합니다.
On Error GoTo -1
에러 처리를 클리어 해, 다른 에러 트랩을 작성할 수 있는 아무것도 설정하지 않습니다.
예:오류 발생 시 GoTo - 1
번째 후 " " "가 발생합니다.GoTo ErrorFound
됩니다.GoTo AnotherErrorFound
에러가 검출되었을 경우.
Sub OnErrorGotoMinusOneTest()
On Error GoTo ErrorFound
Err.Raise Number:=9999, Description:="Forced Error"
Exit Sub
ErrorFound:
On Error GoTo -1 'Clear the current error handling
On Error GoTo AnotherErrorFound 'Set a new one
Err.Raise Number:=10000, Description:="Another Forced Error"
AnotherErrorFound:
'Code here
End Sub
예:오류 발생 시 GoTo 0
첫 번째 오류가 발생한 후 오류 처리가 비활성화되었기 때문에 오류가 표시됩니다.
Sub OnErrorGotoZeroTest()
On Error GoTo 0
Err.Raise Number:=9999, Description:="Forced Error"
End Sub
이 답변은 오류 개체와 오류 핸들러 간의 혼동을 해결합니다.
에러 오브젝트는, 다음의 방법으로 클리어 할 수 있습니다.Err.Clear
에러 핸들러에는 영향을 주지 않습니다.
에러 핸들러는, 를 사용해 유효하게 됩니다.On Error Goto <label>
에러가 발생하면, 액티브하게 됩니다.
에러 핸들러가 액티브한 동안은, 새로운 에러 핸들러를 할당할 수 없습니다. On Error Goto <label>
과가없없 없없없다다VBA는 새 오류 핸들러를 할당하려는 시도를 무시합니다.
「」를 사용합니다.Err.Clear
는 에러 핸들러를 취소하지 않습니다.
의 Goto <label>
는 에러 핸들러를 취소하지 않습니다.「」를 사용합니다.Goto <label>
혼동을 일으킬 수 있으므로 피해야 합니다.에러 핸들러가 실제로 아직 액티브하게 되어 있는 경우는, 에러 핸들러가 액티브하지 않다고 생각할 수 있습니다.
액티브한 에러 핸들러의 결과, 새로운 에러 핸들러를 할당할 수 없게 됩니다. On Error Goto <label>
과가없없 없없없다다VBA는 새 오류 핸들러를 할당하려는 시도를 무시합니다.에러 핸들러가 액티브한 동안은, 그 외의 에러는 처리되지 않습니다.
액티브한 에러 핸들러를 종료하는 유일한 방법은, 다음과 같습니다.
Resume
Resume Next
Resume <label>
On error goto -1
- 절차를 종료하다
이러한 방법 중 하나를 사용하여 오류 핸들러를 종료하면 오류 개체도 지워집니다.
우수한 출처: VBA 칩 Pearson의 Pearson 오류 처리에서 언급하지 않음On error goto -1
그의 기사에서.「 」 、 「 」
On Error GoTo-1은 실제 목적이 없고, 정확하게 사용하지 않으면 Excel 어플리케이션 전체를 잠글 수 있기 때문에 일부러 포함하지 않았습니다.네, On Error GoTo-1은 구문론적으로는 유효하지만, 술 취한 십대에게 총을 주는 것과 같습니다.그것으로부터 좋은 것은 아무것도 얻을 수 없다.
에러 오브젝트 MSDN Inline Error Handling을 사용하여 에러 핸들러를 사용하지 않고 인라인으로 에러를 처리할 수도 있습니다.
VBA에서 오류가 발생했을 때 두 가지 뚜렷한 현상이 발생한다는 것을 깨닫는 것이 중요합니다.
오류 객체의 속성이 설정되어 있습니다(err.number, err.desciption, err.source 등).
실행할 다음 행이 변경됩니다.
실행되는 행은 마지막으로 실행된 "On Error Goto" 문(있는 경우)에 의해 결정됩니다.
이것들은 각각 다르지만 매우 관련이 깊은 토픽이며, 양쪽을 관리하기 위해 사실상 구별되지만 서로 얽힌 코드를 작성합니다.
임의의 오류가 발생하거나 Err을 사용하는 경우.Raise Err 객체는 항상 설정됩니다."On Error Resume next" 또는 기타 On 오류 스테이트먼트를 사용한 경우에도 마찬가지입니다.
따라서 다음과 같은 코드를 항상 사용할 수 있습니다.
Dim i as integer
On error resume next
i = 100/0 ' raises error
if err.number <> 0 then
' respond to the error
end if
에러 오브젝트에 err.number 값이 0이 아닌 경우 예외가 발생하며, "On Error Goto" 스테이트먼트를 실행하려고 하면 오류가 발생하고 실행이 현재 절차를 호출한 코드로 전달된다는 것을 인식하는 것이 매우 중요합니다.(또는, 어느 코드로도 호출되지 않는 경우는, 통상의 VBA 에러 다이얼로그가 표시됩니다).이 시나리오에서 "On Error Goto ALabel1"은 다음 행을 Label1:이 붙은 행으로 변경하지 않습니다.
예
Sub ErrorTest()
Dim dblValue As Double
On Error GoTo ErrHandler1
dblValue = 1 / 0
ErrHandler1:
debug.print "Exception Caught"
debug.print Err.Number
On Error GoTo ALabel1
dblValue = 1 / 0
Exit sub
ALabel1:
debug.print "Again caught it."
End Sub
err.number 속성을 0이 아닌 값으로 설정하면 를 사용하여 0으로 리셋할 수 있습니다.
On Error Goto -1
에러에 주의해 주세요.또한 Clear는 0으로 리셋되지만 실제로는 다음과 같습니다.
On Error Goto -1
On Error Goto 0
ie Err.Clear는 현재 존재하는 "On Error Goto"를 삭제합니다.따라서 대부분의 경우 다음을 사용하는 것이 좋습니다.
On Error Goto -1
Err.clear를 사용하는 경우와 같이, 자주 기입할 필요가 있습니다.
Err.Clear
On Error Goto MyErrorHandlerLabel
그 오류는 주목할 가치가 있다.Clear는 모든 유형의 Resume 스테이트먼트, Exit Sub, Exit Function, Exit Property 또는 On Error 스테이트먼트를 실행할 때마다 암묵적으로 실행됩니다.
error 오브젝트를 원하는 숫자로 설정할 수도 있습니다.
Err.Raise Number:=, 소스:=, 설명:=
Err.Rise는, 에러를 발신 프로그램에 전파해, 「사용자 정의 에러」라고 불리는 독자적인 에러 번호를 올릴 수 있기 때문에, 논리적인 이유로 계속할 수 없는 것을 발신 프로그램에 통지하는 수단이 되기 때문에, 매우 중요합니다.(예를 들어 비즈니스 규칙이 위반되었습니다).
다음에 실행할 코드 행을 다음과 같은 문장으로 제어할 수 있습니다.
On Error Goto ALabelName On Error Goto ANon ZeroLine Number 및 On Error Goto 0'은 오류가 발생한 경우 "현재 범위(일반적으로 하위 또는 함수) 내"로 나타나기 때문에 오류 개체를 현재 하위 또는 함수를 호출한 코드로 되돌립니다.
특히 MSDN 페이지에는 에러 처리를 사용할 수 있는 방법의 완전한 예가 없기 때문에 VBA에서의 에러 처리는 까다롭습니다.
언급URL : https://stackoverflow.com/questions/14158901/difference-between-on-error-goto-0-and-on-error-goto-1-vba
'programing' 카테고리의 다른 글
TextBox에서 Enter 키 (0) | 2023.04.17 |
---|---|
Swift의 if 스테이트먼트 내에서 여러 개의 let-as 사용 (0) | 2023.04.17 |
OS X Lion에서 단말기가 로드되지 않는 문제를 수정하는 방법 ~/.bashrc (0) | 2023.04.12 |
WPF 사이즈를 물리 픽셀로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.12 |
WPF 편집 가능한 콤보 박스 (0) | 2023.04.12 |