2012-05-30 16 views

Odpowiedz

5

Komenda error generuje błąd w bieżącym punkcie; doskonale sprawdza się w przypadkach, gdy rzucasz problem ze względu na wewnętrzny stan procedury. Polecenie return -code error powoduje, że procedura, w której się znajduje, powoduje wystąpienie błędu (tak, jakby procedura była error); Jest to świetne rozwiązanie w przypadku, gdy występuje problem z argumentami przekazanymi do procedury (np. wywołujący zrobił coś nie tak). Różnica naprawdę przychodzi, gdy patrzysz na ślad stosu.

Oto przykład (wymyślony!):

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

Istnieją również różnice jeśli używają 'catch' wewnątrz procedury pułapkę dwa różne przypadki, ale to robi się dużo bardziej skomplikowane. –

+1

Prawdopodobnie warto też wspomnieć, że skoro Tcl 8.5 'return' nauczył się opcji' -level', która mogłaby zostać użyta do podniesienia błędu gdzieś wyżej na stosie, który może być użyty przy implementacji niestandardowych złożonych poleceń (zwykle udających, że tworzy DSL). "Błąd" nie może tego zrobić. – kostix

Powiązane problemy