Có cách nào để bắt "Lỗi thông dịch Tcl" toàn cầu không? Ví dụ tôi muốn tự động lưu trữ trong một số tập tin tin nhắn sau.Bắt "Lỗi thông dịch Tcl"
Trả lời
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ố.
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.
- 1. Tạo một thông dịch viên TCL chỉ hỗ trợ các lệnh mà tôi cung cấp
- 2. Biến tĩnh trong Tcl
- 3. Dịch vụ Bắt đầu từ Thông báo
- 4. Phát hiện lỗi trong các kịch bản Tcl
- 5. Thông báo lỗi biên dịch: CS0433
- 6. Lỗi SqlServer.Management.SMO.Server khi bắt đầu giao dịch
- 7. Bắt lỗi biên dịch CS0579: Nhân đôi thuộc tính 'AssemblyFileVersionAttribute'
- 8. Thông thường các lỗi chung biên dịch lỗi
- 9. Android: bắt đầu dịch vụ với thông số
- 10. Lỗi bắt đầu dịch vụ ASP.NET Nhà nước
- 11. Lỗi khi bắt đầu dịch vụ. Không tìm thấy OracleMTSRecoveryService
- 12. Lỗi khi bắt đầu trình biên dịch hiện đại
- 13. Python: Cách phát hiện trình thông dịch gỡ lỗi
- 14. Chuỗi TCL concat
- 15. Peculiar Tcl cú pháp
- 16. Android - Bắt đầu một dịch vụ với thông tin bổ sung thông qua put/getExtra
- 17. Cách bắt lỗi DB và dịch chúng thành thông tin có ý nghĩa cho lớp doanh nghiệp?
- 18. Mã gỡ lỗi trong trình thông dịch Python
- 19. python Lỗi đa hồ bơi Assertion trong thông dịch
- 20. Lỗi Java APNS (Dịch vụ thông báo đẩy của Apple)
- 21. Ví dụ về Tcl/Tk?
- 22. Bắt đầu Cứu nạn không bắt lỗi
- 23. Bắt lỗi http
- 24. Cách khởi tạo một mảng trong Tcl?
- 25. Bắt đầu quy trình có thông tin xác thực từ Dịch vụ Windows
- 26. Lỗi bắt lỗi bằng Python và FTP
- 27. Lỗi Bash Script Bắt
- 28. TCL mong đợi biểu thức chính quy
- 29. Biểu đồ tương tác trong Tcl/Tk
- 30. Guice @Transactional không bắt đầu giao dịch
Đề 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