2012-03-30 32 views

Trả lời

5

Lệnh lõi để bẫy bất kỳ loại lỗi nào được Tcl đưa ra là catch. Phải mất ít nhất một đối số, một tập lệnh để đánh giá và trả về mã kết quả từ việc đánh giá tập lệnh đó. Mã kết quả là 1 khi xảy ra lỗi, 0 khi không có lỗi và một loạt các thứ khác trong các trường hợp khác (chỉ ra các loại ngoại lệ thường không phải là lỗi). Các catch cũng có một đối số tùy chọn mà tên một biến mà để viết kết quả của việc đánh giá kịch bản hoặc thông báo lỗi. Biến toàn cục errorInfo sẽ chứa dấu vết ngăn xếp trong trường hợp xảy ra lỗi (hoặc từ 8.5 trở đi bạn có thể nhận từ điển trạng thái thông dịch với tên biến khác được chuyển đến catch).

Để bẫy lỗi trong một số kịch bản “foo.tcl”, bạn sẽ sử dụng mã như thế này:

if {[catch {source foo.tcl} msg]} { 
    puts "I got an error: $msg" 
    puts "The stack trace was this:\n$errorInfo" 
} 

Đó là tùy thuộc vào bạn để làm việc ra làm thế nào để viết rằng ra vào một tập tin nếu bạn muốn. (Tôi sử dụng kỹ thuật này với một kịch bản bên ngoài thực hiện một bẫy lỗi được kiểm tra cẩn thận và tải một kịch bản bên trong thực hiện công việc thực sự. Tôi thấy nó hoạt động tốt. Hoặc bạn có thể gọi các thủ tục trong kịch bản "bị bắt" đó. ; Tcl nên tất cả lỗi trappable, và có rất ít điều kiện mà lọt qua)


Các tuyến đường khác là lỗi có thể được báo cáo là thông qua bgerror, được gọi để xử lý các lỗi xảy ra trong sự kiện này. Chế biến. Đó là một thủ tục bạn có thể viết phiên bản của riêng bạn; nó sẽ được trao cho một cuộc tranh luận duy nhất khi gọi đó là thông báo lỗi, và sẽ có toàn cầu errorInfo thiết lập một cách chính xác khi gọi:

proc bgerror {msg} { 
    global errorInfo 
    puts "I got an error in an event: $msg" 
    puts "The stack trace was this:\n$errorInfo" 
} 

Nếu không có thực hiện bgerror xác định, stack trace được chỉ ghi vào Kênh stderr. Nếu bạn đang sử dụng gói Tk, việc triển khai bgerror được cung cấp bật lên một hộp thoại mô tả sự cố.

1

Hãy thử các lệnh bgerror hoặc interp bgerror.

Đọc tài liệu bgerror, nó có một ví dụ đơn giản.

+0

Đề xuất tốt. Nhưng nó không hoạt động. :(Tôi vẫn nhận được 'Lỗi thông dịch viên Tcl ': không thể đọc" on1 ": không có biến số nào như vậy trên các thiết bị đầu cuối, nhưng không có trong hàm. – ilya1725

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