2008-10-13 3 views
1

나는 이것 때문에 머리를 크게 부딪 혔습니다. $ etrap (오류 처리 특수 변수) 방식이 생각 나게되면 모든 오류를 정말로 잡아 두어야합니다. 나는 이것을 성공적으로 해왔다. 하지만 사용자 모드 (응용 프로그램 모드)에서 실행될 때 내부 캐시 라이브러리 오류로 인해 여전히 응용 프로그램이 중지되기 때문에 나는 여전히 뭔가를 놓치고 있습니다. 내가 무슨 짓을

했다 :

이 모든 후
ProcessX(var) 

    set sc=$$ProcessXProtected(var) 
    w !,"after routine call" 
    quit sc 

ProcessXProtected(var) 

    new $etrap 
    ;This stops Cache from processing the error before this context. Code 
    ; will resume at the line [w !,"after routine call"] above 
    set $etrap="set $ECODE = """" quit:$quit 0 quit" 

    set sc=1 
    set sc=$$ProcessHelper(var) 
    quit sc 

ProcessHelper(var) 

    new $etrap 
    ; this code tells Cache to keep unwindind error handling context up 
    ; to the previous error handling. 
    set $etrap="quit:$quit 0 quit" 

    do AnyStuff^Anyplace(var) 

    quit 1 

AnyStuffFoo(var) 
    ; Call anything, which might in turn call many sub routines 
    ; The important point is that we don't know how many contexts 
    ; will be created from now on. So we must trap all errors, in any 
    ; case. 

    ;Call internal Cache library 
    quit 

, 내가 프롬프트에서 프로그램을 호출 할 때 작동하는지 볼 수 있습니다! 하지만 캐시 터미널 스크립트 (응용 프로그램 모드, 내가 말한)에서 호출하면 프로그램이 중단되고 오류 트래핑 메커니즘이 예상대로 작동하지 않습니다.

표시 등이 있습니까? 사전에

감사합니다,

루이스 페르난도

답변

1

인가는 이전 스타일의 오류 트랩 ($ ZTRAP 참조)은 사용자 모드에 설정되는 것이 가능하다?

이 문서는 꽤 좋기 때문에 여기서는 반복하지 않겠지 만 핵심은 $ ZTRAP이 $ ETRAP과 같은 방식으로 New-ed가 아니라는 것입니다. 어떤면에서는 현재의 스택 레벨과 후속 호출에만 값이 적용된다는 점에서 "암시 적으로 새롭게 수정"됩니다.

또한 $ ETRAP와 $ ZTRAP 처리기 사이에 우선 순위가 정해져 있는지 확신 할 수 없지만 $ ZTRAP가 다음과 같은 경우에는 확실하지 않습니다. 우선 순위가 높으면 $ ETRAP보다 우선합니다.

라이브러리 기능을 호출하기 바로 전에 $ ZTRAP을 직접 설정할 수 있습니다. $ ETRAP과 다른 값으로 설정하면 어느 것이 트리거되었는지 확인할 수 있습니다.

심지어 그게 도움이되지 않을 수도 있습니다. 라이브러리 함수 내에서 $ ZTRAP이 설정되면 새 값이 적용되므로 차이가 발생하지 않습니다. 이것은 $ ZTRAP의 가치가 스택의 어느 곳에서 왔을 때만 도움이 될 것입니다.

당신은이 문제를 일으킨 라이브러리 기능에 대해 언급하지 않았습니다. 우리 회사는 일부 라이브러리 함수에 대한 소스 코드를 가지고 있습니다. 그래서 함수 이름을 말할 수 있다면 제가 찾을 수있는 것을 보게 될 것입니다. $ ZVersion의 가치도 알려 주시면 캐시의 동일한 버전에 대해 말씀 드릴 수 있습니다.

관련 문제