postscript
गलती संभालना
खोज…
वाक्य - विन्यास
{ -code- } रोका { -रोर- } { -no - error-} ifelse% error फ्रेम को पकड़ रहा है
$ त्रुटि / ग़लती से% स्टैन्ड्रफ़्लोफ़्लो टाइपकेक रंगचेक आदि मिलता है
$ त्रुटि / न्यूट्रर% बूल मिलता है। त्रुटि को निष्क्रिय करने के लिए गलत डालें
$ त्रुटि / ओस्टैक को त्रुटि के बिंदु पर ऑपरेंड स्टैक की% कॉपी मिलती हैगलत / स्टैकओवरफ़्लो { -डायरेक्शनल-कोड- / स्टैकओवरफ़्लो सिग्नलरोर } डाला
% त्रुटियों के प्रकारों पर अतिरिक्त कोड निष्पादित करते हैं (यहां, / स्टैकओवरफ़्लो त्रुटि)।
टिप्पणियों
पोस्टस्क्रिप्ट में त्रुटि से निपटने के दो स्तर हैं। यह द्विभाजन दोनों को लागू करता है जिस तरह से दुभाषिया त्रुटियों को संभालने के साथ-साथ उपयोगकर्ता (प्रोग्रामर) के लिए उपलब्ध साधनों को संभालता है।
निचले स्तर पर एक असामान्य नियंत्रण संरचना stop ... stopped
। stopped
बहुत अधिक एक लूपिंग निर्माण की तरह व्यवहार करता है जिसमें यह निष्पादन स्टैक पर एक निशान स्थापित stop
है जिसे जंप किया जा सकता है-अगर exit
ऑपरेटर (एक लूप के लिए) या stop
ऑपरेटर (एक stopped
-कंटेक्ट के लिए) को कहा जाता है। एक लूपिंग निर्माण के विपरीत, स्टैक पर एक बुलियन की पैदावार को stopped
, यह दर्शाता है कि क्या stop
कहा गया था (अन्यथा stopped
करने के लिए पारित प्रक्रिया को पूरा करने के लिए निष्पादित किया जाता है।
जब एक पोस्टस्क्रिप्ट त्रुटि की तरह है, तब होता है stackunderflow
शायद, दुभाषिया में त्रुटि के नाम की खोज करता है errordict
जो में रहती है systemdict
। यदि उपयोगकर्ता ने errordict
से प्रक्रिया को प्रतिस्थापित नहीं किया है, तो डिफ़ॉल्ट त्रुटि प्रक्रिया सभी स्टैक के स्नैपशॉट लेगी और उन्हें $error
में systemdict
, जो कि systemdict
में एक और शब्दकोश है। अंत में, डिफ़ॉल्ट प्रक्रिया stop
हो जाएगी जो निष्पादन स्टैक से उपयोगकर्ता प्रोग्राम को पॉप करती है और handleerror
से errordict
में इंटरप्रेटर की त्रुटि मुद्रण प्रक्रिया को handleerror
errordict
।
इसलिए इस सभी ज्ञान का उपयोग करके, आप { ... } stopped
कोड के एक सेक्शन को लपेटकर त्रुटियों को पकड़ सकते हैं। आप stop
कॉल करके किसी त्रुटि को हटा सकते हैं। आप निर्धारित कर सकते हैं कि $error /errorname get
साथ किस प्रकार की त्रुटि हुई।
आप एक विशिष्ट प्रकार की त्रुटि के लिए डिफ़ॉल्ट व्यवहार को उस नाम की errordict
प्रक्रिया से errordict
। या /handleerror
में errordict
/handleerror
द्वारा त्रुटि रिपोर्ट को प्रिंट करने के प्रारूप को errordict
।
क्या कोई करंट है?
उपज true
ढेर पर अगर currentpoint
कार्यान्वित सफलतापूर्वक, या false
अगर यह एक संकेत है /nocurrentpoint
त्रुटि।
{currentpoint pop pop} stopped not % bool
किसी त्रुटि के संकेत मिलने पर घटनाओं का अनुक्रम
त्रुटि के लिए अनुक्रम आमतौर पर है:
- त्रुटी को
errordict
और इस प्रक्रिया को निष्पादित करने से त्रुटिerrordict
होती है। -
errordict
प्रक्रिया कॉलsignalerror
, इसे पारित त्रुटि नाम। -
signalerror
$error
स्टैक में स्नैपशॉट को सहेजते हुए,signalerror
का स्नैपशॉट लेता है और फिर कॉलstop
। -
stop
पॉप को तब तकstop
जब तक कि बंद ऑपरेटर द्वारा स्थापित निकटतम एन्कोडिंग रोक दिया गया संदर्भ न हो। - यदि प्रोग्राम ने त्रुटि को पकड़ने के लिए अपना स्वयं का रूका हुआ संदर्भ स्थापित नहीं किया है, तो उसे बाहरी स्तर पर
stopped { errordict /handleerror get exec } if
किया जाता हैstopped { errordict /handleerror get exec } if
पकड़ा जाएगा, जिसे स्टार्टअप कोड द्वारा पूरे उपयोगकर्ता प्रोग्राम को ब्रैकेट करने के लिए बुलाया गया था। -
handleerror
त्रुटि रिपोर्ट मुद्रित करने के लिए$error
में जानकारी का उपयोग करता है।
सिग्नलिंग (फेंकना) एक त्रुटि
अधिकांश उपकरण त्रुटि को फेंकने के लिए ऑपरेटर के नाम के अपवाद के साथ मानकीकृत होते हैं। Adobe दुभाषियों में, इसे .error
कहा जाता है। घोस्टस्क्रिप्ट में, इसे signalerror
कहा जाता है। तो इस लाइन के साथ आप उपयोग कर सकते signalerror
एडोब दुभाषिए या Ghostscript या xpost के लिए उपसंहार कोड में।
/.error where {pop /signalerror /.error load def} if
commandname 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
निर्माण में कोड संलग्न करके ऑपरेटरों से त्रुटियों को पकड़ सकते हैं।
{
0 array
1 get
} stopped {
$error /errorname get =
} if
" rangecheck
" को प्रिंट करेगा, त्रुटि तब get
जब सूचकांक उस सरणी के लिए स्वीकार्य सीमा से बाहर हो।
पुन: फेंकने की त्रुटियाँ
यह स्निपेट एक प्रक्रिया को लागू करता है जो एक पोस्टस्क्रिप्ट लूपिंग ऑपरेटर की तरह व्यवहार करता है। उपयोगकर्ता हैं proc
कॉल exit
, यह पकड़ता invalidexit
त्रुटि के लिए dictstack ठीक करने के लिए end
अंत में। invalidexit
को छोड़कर किसी भी अन्य त्रुटि को stop
कॉल करके फिर से फेंक दिया जाता है।
% 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 ()=