Czym właściwie jest różnica w zgłaszaniu wyjątku w TCL przez return -code error ...
i error ...
? Kiedy jeden zostanie użyty zamiast drugiego?Jaka jest różnica między błędem kodu powrotu a błędem?
5
A
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"
Powiązane problemy
- 1. Jaka jest różnica między błędem segmentacji a przepełnieniem stosu?
- 2. Jaka jest różnica między normalnym błędem kompilatora a fatalnym błędem kompilatora?
- 3. Jaka jest różnica między błędem, stderr, stdout w węźle
- 4. Jaka jest różnica między functools.wraps a update_wrapper
- 5. Jaka jest różnica między cat_id a term_id?
- 6. Jaka jest różnica między @Inject a @PersistenceContext?
- 7. Jaka jest różnica między szwem a makietą?
- 8. Jaka jest różnica między UIViewController a UITableViewController
- 9. Jaka jest różnica między IEnumerable a tablicami?
- 10. Jaka jest różnica między == a === w Verilog?
- 11. Jaka jest różnica między UseCase a Workflow?
- 12. Jaka jest różnica między pakietem a intencją?
- 13. Jaka jest różnica między węzłem a wierzchołkiem?
- 14. Jaka jest różnica między Ember.computed.alias a Ember.binding?
- 15. Jaka jest różnica między alertem a window.alert?
- 16. Jaka jest różnica między @android a android:
- 17. Jaka jest różnica między krotką a kompresją?
- 18. Jaka jest różnica między proxy a reify?
- 19. Jaka jest różnica między sqlite3 a pdo_sqlite
- 20. Jaka jest różnica między Const a Constant?
- 21. Jaka jest różnica między Socket.IO a Firebase?
- 22. Jaka jest różnica między macierzą a tablix?
- 23. Jaka jest różnica między KERN_INVALID_ADDRESS a KERN_PROTECTION_FAILURE?
- 24. Jaka jest różnica między Float.POSITIVE_INFINITY a Float.MAX_VALUE?
- 25. Jaka jest różnica między SGML a XML?
- 26. Jaka jest różnica między Cake a Leiningen?
- 27. Jaka jest różnica między JavaBean a POJO?
- 28. Jaka jest różnica między kopiowaniem a klonowaniem?
- 29. Jaka jest różnica między HAVING a WHERE?
- 30. Jaka jest różnica między ItemTemplate a ItemPanelTemplate?
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. –
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