2012-05-30 44 views

Trả lời

5

Lệnh error tạo lỗi ngay tại điểm hiện tại; nó là tuyệt vời cho các trường hợp bạn đang ném một vấn đề do trạng thái nội bộ của thủ tục. Lệnh return -code error làm cho quy trình được đặt trong quá trình tạo lỗi (như thể quy trìnherror); thật tuyệt vời cho trường hợp có vấn đề với các đối số được chuyển đến quy trình (tức là, người gọi đã làm điều gì đó sai). Sự khác biệt thực sự xảy ra khi bạn nhìn vào dấu vết ngăn xếp.

Dưới đây là một ví dụ (contrived!):

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

Ngoài ra còn có sự khác biệt nếu bạn sử dụng 'catch' bên trong thủ tục để bẫy hai trường hợp khác nhau, nhưng đó là nhận được rất nhiều phức tạp hơn. –

+1

Có lẽ cũng đáng nói rằng kể từ khi Tcl 8.5 'return' đã học được tùy chọn' -level' có thể được sử dụng để nâng cao lỗi ở đâu đó cao hơn, có thể được sử dụng khi thực hiện các lệnh phức tạp tùy chỉnh (thường giả vờ thành DSL). 'lỗi' không thể làm điều đó. – kostix

Các vấn đề liên quan