2012-05-30 28 views

उत्तर

5

error कमांड वर्तमान बिंदु पर एक त्रुटि उत्पन्न करता है; यह उन मामलों के लिए बहुत अच्छा है जहां आप किसी प्रक्रिया की आंतरिक स्थिति के कारण कोई समस्या फेंक रहे हैं। return -code error कमांड एक त्रुटि उत्पन्न करने में प्रक्रिया को बनाता है (जैसे प्रक्रियाerror थी); यह उस मामले के लिए बहुत अच्छा है जहां प्रक्रिया में दिए गए तर्कों में कोई समस्या है (यानी, कॉलर ने कुछ गलत किया)। अंतर वास्तव में आता है जब आप स्टैक ट्रेस को देखते हैं। (! काल्पनिक)

यहाँ एक उदाहरण है:

proc getNumberFromFile {filename} { 
    if {![file readable $filename]} { 
     return -code error "could not read $filename" 
    } 
    set f [open $filename] 
    set content [read $f] 
    close $f 
    if {![regexp -- {-?\d+} $content number]} { 
     error "no number present in $filename" 
    } 
    return $number 
} 

catch {getNumberFromFile no.such.file} 
puts $::errorInfo 
#could not read no.such.file 
# while executing 
#"getNumberFromFile no.such.file" 

catch {getNumberFromFile /dev/null} 
puts $::errorInfo 
#no number present in /dev/null 
# while executing 
#"error "no number present in $filename"" 
# (procedure "getNumberFromFile" line 9) 
# invoked from within 
#"getNumberFromFile /dev/null" 
+0

वहाँ भी मतभेद यदि आप 'फँसाने के लिए प्रक्रिया के अंदर catch' दो अलग-अलग मामलों का उपयोग कर रहे हैं, लेकिन यह एक बहुत अधिक जटिल हो रही है। –

+1

शायद यह उल्लेख करने लायक है कि चूंकि टीसीएल 8.5 'रिटर्न' ने '-लेवल' विकल्प सीखा है जिसका उपयोग स्टैक पर कहीं अधिक त्रुटि को बढ़ाने के लिए किया जा सकता है, जिसका उपयोग कस्टम कॉम्प्लेक्स कमांड को लागू करते समय किया जा सकता है (आमतौर पर एक डीएसएल बनाने का नाटक)। 'त्रुटि' ऐसा नहीं कर सकता है। – kostix