수색…


통사론

  • { -code- } stopped { -error- } { -no-error- } ifelse 오류 잡기 프레임 %

  • $ error / errorname % stackunderflow typecheck rangecheck 등을 얻습니다.
    $ error / newerror는 % bool을 가져옵니다. 오류를 비활성화하려면 false를 넣는다.
    $ error / ostack 오류 지점에서 피연산자 스택의 % copy를 얻습니다.

  • errordict / stackoverflow { - 추가 코드 - / stackoverflow signalerror } 넣어
    %는 오류 유형 (여기서는 / stackoverflow 오류)에 대한 추가 코드를 실행합니다.

비고

포스트 스크립트에서는 오류 처리에 두 가지 수준이 있습니다. 이 이분법은 해석자가 오류를 처리하는 방법과 사용자 (프로그래머)가 처리를 제어하는 ​​데 사용할 수있는 방법 모두에 적용됩니다.

낮은 수준은 비정상적인 제어 구조 stop ... stopped . stopped 된 루프는 실행 스택에서 루프에 대한 exit 연산자 ( stopped -context에 대한 stop 연산자)가 호출 될 때 실행 스택에서 점프 할 수있는 마크를 설정한다는 점에서 루프 구조와 매우 유사합니다. 반복되는 구조와 달리, stopped 여부를 나타내는 스택 수율에게 부울 stop 불렸다 (에 전달 그렇지 않으면 절차 stopped 완료 실행될 것으로 알려져있다.

stackunderflow 와 같은 포스트 스크립트 오류가 발생하면 인터프리터는 systemdict 있는 errordict 에서 오류의 이름을 errordict . 사용자가 errordict 에서 프로 시저를 errordict 않으면 기본 오류 프로시 저는 모든 스택의 스냅 샷을 가져 와서 systemdict 다른 사전 인 $errorsystemdict 합니다. 마지막으로, 디폴트 프로시 저는 stop 을 호출하여 사용자 프로그램을 exec 스택에서 팝하고 handleerror 에서 errordict 라는 인터프리터의 오류 인쇄 프로 시저를 실행합니다.

따라서이 모든 지식을 사용하면 { ... } stopped 코드 섹션을 래핑하여 오류를 잡을 수 있습니다. stop 을 호출하여 오류를 다시 전복 할 수 있습니다. $error /errorname get 어떤 유형의 오류가 발생했는지 확인할 수 있습니다.

errordict 에서 해당 이름으로 프로 시저를 바꾸면 특정 유형의 오류에 대한 기본 동작을 변경할 수도 있습니다. 또는 대체하여 오류 보고서를 인쇄하는 형식 변경 /handleerrorerrordict .

현재 시점이 있습니까?

currentpoint 성공적으로 실행되면 스택에서 true 를 반환하고 /nocurrentpoint 오류가 발생하면 false 반환합니다.

{currentpoint pop pop} stopped not  % bool

오류가 발생했을 때의 이벤트 시퀀스

오류의 순서는 대개 다음과 같습니다.

  1. errordict 에서 오류 이름을 errordict 프로 시저를 실행하면 오류가 트리거됩니다.
  2. errordict 절차를 호출 signalerror 그것을 오류 이름을 전달.
  3. signalerror 는 스택의 스냅 샷을 취하여 스냅 샷을 $error 에 저장 한 다음 stop 을 호출 stop .
  4. stop 은 중지 된 운영자가 설정 한 가장 가까운 둘러싸 기된 중지 컨텍스트가 될 때까지 exec 스택을 팝합니다.
  5. 프로그램이 오류를 잡기 위해 자체 중지 된 컨텍스트를 설정하지 않은 stopped { errordict /handleerror get exec } if 전체 사용자 프로그램을 대괄호로 stopped { errordict /handleerror get exec } if 시작 코드에 의해 호출 된 외부 수준의 stopped { errordict /handleerror get exec } if 의해 캐치됩니다.
  6. handleerror$error 의 정보를 사용하여 오류 보고서를 인쇄합니다.

오류의 신호 전달 (throwing)

대부분의 도구는 오류를 던질 연산자의 이름을 제외하고는 표준화되어 있습니다. Adobe 인터프리터에서는 .error 라고합니다. 고스트 스크립트에서는이를 signalerror 라고합니다. 이 라인 그래서 당신이 사용할 수있는 signalerror 어도비 통역이나 고스트 스크립트 또는 xpost에 대한 포스트 스크립트 코드.

/.error where {pop /signalerror /.error load def} if

명령 이름의 errorname의 signalerror -
$error 에서 스택의 스냅 샷을 가져온 다음 stop .

예 :

% my proc only accepts integer
/proc {
    dup type /integertype ne {
        /proc cvx /typecheck signalerror
    } if
    % ... rest of proc ...
} def

오류 잡기

기본 오류 처리기의 마지막 동작은 stop 을 호출하는 것이므로 { ... } stopped 구문에 코드를 포함하여 연산자에서 오류를 catch 할 수 있습니다.

{
    0 array
    1 get
} stopped {
    $error /errorname get =
} if

"인쇄 할 rangecheck "에 의해 신호 에러 get 인덱스가 배열에 대한 허용 범위를 벗어나는 경우를.

다시 던지는 오류

이 스 니펫은 포스트 스크립트 루프 연산자처럼 작동하는 프로 시저를 구현합니다. 사용자 procexit 호출하면 invalidexit 오류를 포착하여 end 에 dictstack을 수정합니다. invalidexit 제외한 다른 모든 오류는 stop 을 호출하여 다시 throw됩니다.

% array n proc  .  -
% Like `forall` but delivers length=n subsequences produced by getinterval
/fortuple { 4 dict begin
    0 {offset proc n arr} {exch def} forall
    /arr load length n idiv
    {
        {
            /arr load offset n getinterval
            [ /proc load currentdict end /begin cvx ] cvx exec
            /offset offset n add def
        } stopped {
            $error /errorname get /invalidexit eq
            { 1 dict begin exit }{ stop } ifelse
        } if
    } repeat
end
} def

%[ 0 1 10 {} for ] 3 {} fortuple pstack clear ()=


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow