私はLuaから呼び出せるC++の機能を持っています。私はそこに文字列変数を使用する必要はありません知っているが、それは、問題を実証することがあります:Luaから関数を呼び出すときにC++の例外を処理する方法は?
int PushHello(lua_State *L){
string str("Hello");
lua_pushlstring(L, str.data(), str.length());
return 1;
}
注:ここでは私の問題を示すためには、一例です。私は例外をスローすることがLuaの文字列コンストラクタからこの関数を呼び出すと
:ここ
は私の二つの問題があります。問題ありますか?ルアはそれを処理し、ルアスタックを適切に巻き戻しますか?私はそうは思わない。それをどうすれば解決できますか?そのようなコードのまわりに
try/catch
を追加し、例外をlua_errorに変換する必要がありますか?より良い解決策はありませんか?longjmp関数を使用した場合はC++が
lua_pushlstring()
通話lua_error()
文字列のデストラクタが呼び出されることはないされたときのように、私はおそらくLuaのをコンパイルすることによって解決している別の問題。問題は、C++としてコンパイルし、longjmpを使用する代わりに例外をスローすることで解決されますか?明確にするために
、私は問題1に見ることができる可能な解決策は、このようになります:
int PushHello(lua_State *L){
string str;
try{
str.assign("Hello");
catch(exception &e){
luaL_error(L, e.what());
}
lua_pushlstring(L, str.data(), str.length());
return 1;
}
しかしtry/catch
は、多くの場所に追加される必要があるであろうと、それは非常に醜いとエラーが発生しやすくなります。それはマクロとして実行することができ、投げることができるすべてのコマンドを置くことができますが、これはあまりうまくいかないでしょう。
私はこのスタック交換[案](HTTPと思います@Blaho ://area51.stackexchange.com/proposals/11464/code-review?referrer = aWNm_PdciyFqjFW8CUacGw2 "コードレビュー")があなたにとって興味深いかもしれません。それがあなたのサポートを示し、それをベータ版に手伝ったら! :) – greatwolf