私はいくつかの言語で書かれたスクリプトを解析するためにLuaを使用しています(Lと呼んでください)。ルアジット。しかし、ユーザのデバッグを簡単にするために、Lua/LuaJITで与えられた実行時エラーをLファイルの正しい行にマップしたいと考えています。私は、作成したLuaコードをxpcallingして、エラーメッセージとスタックトレースを翻訳してから、このメッセージでエラーを呼び出します。残念ながら、これは私に2つのスタックトレースを与えます。一つは私が作成し、もう一つはエラーを呼び出した関数にトレースします。このスタックトレースを取り除くことは可能ですか、これを行うにはより良い方法がありますか?Lua:スタックトレースなしでエラーを呼び出す方法
local status, err = xpcall(loadedCode, debug.traceback)
if not status then
error(createANewErrorMessageWithPrettyTraceback(err),0)
end
出力:
luajit: ./my/file.name:5: Some error message
stack traceback:
my pretty traceback
stack traceback:
[C]: in function 'error'
./my/file/calling/error.lua:44: in function <./my/file/calling/error.lua:26>
./my-main:16: in main chunk
[C]: at 0x00404180
私はその例を知っていますMoonscriptはこれと似たようなことをしますが、私が見る限り、新しいエラーメッセージをstderrに書き込んだり、やりたいことであるプログラムを停止するのではなく、通常通り続行します。
これを実行して引数を指定せずにエラーを呼び出すと、プログラムが失敗する可能性があります(実際にはエラーが発生したと思います)。しかし、これはかなり醜い解決策のように感じます。それよりも2番目の痕跡。
PS:実際にはタイトルが尋ねるものは動作しません(エラーには2つの引数しかないので)。だから私が実際に求めていることは、このようなことがどのように達成できるかです。 (おそらく似たようなことをしている他の関数や、自分でその関数を書く方法を理解する必要がある場所はありますか?)
編集:エラーがトレースバックを取得するために使用している関数をそのまま編集することは可能でしょうか? debug.traceback?
エラーを呼び出す代わりにトレースバックを印刷するだけではどうですか? –
私はエラーが発生したときにプログラムが失敗するのを待っています。しかし、Ryan Steinが下で指摘したように、私はos.exitを呼び出すことができます。 – MartinValen