トレースドキュメントには、「commandPrefixの実行中にエラーが発生した場合、コマンド名全体で同じエラーが返される」と記載されています。ただし、コマンドプレフィックスに誤りがある以下のコードを実行してもエラーは表示されません。このエラー情報を取得するにはどうすればよいですか?
proc a args { puts hello }
proc b args { bad stuff }
trace add execution a leave b
a
私はただ「こんにちは」を得る
トレースドキュメントには、「commandPrefixの実行中にエラーが発生した場合、コマンド名全体で同じエラーが返される」と記載されています。ただし、コマンドプレフィックスに誤りがある以下のコードを実行してもエラーは表示されません。このエラー情報を取得するにはどうすればよいですか?
proc a args { puts hello }
proc b args { bad stuff }
trace add execution a leave b
a
私はただ「こんにちは」を得る
まず、hello
はプロシージャによって出力されますが、プロシージャによって出力されません。実行トレースは、印刷出力をトラップしません。(チャネル上で変換をレイヤー化することにより、Tcl 8.6で印刷出力をトラップできますがstdout
、それはまったく別のことです。)
それでは、代わりにコードをこれに変更しましょう。これにより、何が起こっているかがはるかに明確になります。
proc a args { puts hello; return flimgargle }
proc b args { puts "b:$args"; error "bad stuff" }
trace add execution a leave b
puts [a]
tclsh8.4とtclsh8.6(現在の開発HEADから構築)を使用すると、次のようになります(最後の行はエラーメッセージです)。
こんにちは b:a 0 flimgargle Leave 悪い質
tclsh8.5(具体的には8.5.2)を使用すると、次のようになります。
こんにちは b:a 0 flimgargle Leave flimgargle
これはtclsh8.5の既知のバグであり(8.5から8.4の間でトレースの実装方法が変更されたため)、次のリリース(8.5.14)で修正されています。そのためのリリース候補をテストしているだけなので、修正はRealSoonで広く利用できるようになるはずです。