수색…
통사론
{ -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
다른 사전 인 $error
에 systemdict
합니다. 마지막으로, 디폴트 프로시 저는 stop
을 호출하여 사용자 프로그램을 exec 스택에서 팝하고 handleerror
에서 errordict
라는 인터프리터의 오류 인쇄 프로 시저를 실행합니다.
따라서이 모든 지식을 사용하면 { ... } stopped
코드 섹션을 래핑하여 오류를 잡을 수 있습니다. stop
을 호출하여 오류를 다시 전복 할 수 있습니다. $error /errorname get
어떤 유형의 오류가 발생했는지 확인할 수 있습니다.
errordict
에서 해당 이름으로 프로 시저를 바꾸면 특정 유형의 오류에 대한 기본 동작을 변경할 수도 있습니다. 또는 대체하여 오류 보고서를 인쇄하는 형식 변경 /handleerror
에 errordict
.
현재 시점이 있습니까?
currentpoint
성공적으로 실행되면 스택에서 true
를 반환하고 /nocurrentpoint
오류가 발생하면 false
반환합니다.
{currentpoint pop pop} stopped not % bool
오류가 발생했을 때의 이벤트 시퀀스
오류의 순서는 대개 다음과 같습니다.
-
errordict
에서 오류 이름을errordict
프로 시저를 실행하면 오류가 트리거됩니다. -
errordict
절차를 호출signalerror
그것을 오류 이름을 전달. -
signalerror
는 스택의 스냅 샷을 취하여 스냅 샷을$error
에 저장 한 다음stop
을 호출stop
. -
stop
은 중지 된 운영자가 설정 한 가장 가까운 둘러싸 기된 중지 컨텍스트가 될 때까지 exec 스택을 팝합니다. - 프로그램이 오류를 잡기 위해 자체 중지 된 컨텍스트를 설정하지 않은
stopped { errordict /handleerror get exec } if
전체 사용자 프로그램을 대괄호로stopped { errordict /handleerror get exec } if
시작 코드에 의해 호출 된 외부 수준의stopped { errordict /handleerror get exec } if
의해 캐치됩니다. -
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
인덱스가 배열에 대한 허용 범위를 벗어나는 경우를.
다시 던지는 오류
이 스 니펫은 포스트 스크립트 루프 연산자처럼 작동하는 프로 시저를 구현합니다. 사용자 proc
가 exit
호출하면 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 ()=