如何在C#中捕获Lua异常

4
我正在使用一个名为LuaInterface的程序集,在我的C#应用程序中运行lua代码。在lua执行期间,我创建了一些WinForms和映射事件处理程序(lua方法)到它们上面。
问题是doString(又称runLuaCode)方法仅运行初始化例程和构造函数。这是可以接受的和有意的,但doString函数是非阻塞的,因此函数返回,而Lua创建的表单仍然存在。这意味着任何未在构造函数期间引发的异常(空引用等)都不会由lua错误处理处理,并且会崩溃直到我的Editor的wndProc - 这很可能会使我的编辑器崩溃,并使错误处理几乎不可能。
是否有任何方法可以创建一个新线程/进程/AppDomain,以处理其自己的WndProc,以便只有这个子任务需要处理异常?
我应该在lua的doString中使用while循环阻止我的Editor,直到表单关闭吗?
我还有哪些选项?
对此事的任何建议都将不胜感激!

哦 - 我明白了... 这不是故意的 - 对不起,感谢您的提示 - 提醒自己 - 阅读文档。 - Tobias Boschek
现在修复这个问题还不晚;-) - Alexander Gladysh
1个回答

0
另一个Lua爱好者!!终于有人了! :) 我也在考虑在我的.NET应用程序中使用Lua进行宏脚本编写。
我不确定我是否理解了。我编写了一些示例代码,似乎工作正常。在DoString周围加上简单的try catch可以获取到LuaExceptions。除非您显式创建新线程,否则DoString会阻塞主线程。在新线程的情况下,普通的.NET多线程异常处理规则适用。
例如:
public const string ScriptTxt = @"
luanet.load_assembly ""System.Windows.Forms""
luanet.load_assembly ""System.Drawing""

Form = luanet.import_type ""System.Windows.Forms.Form""
Button = luanet.import_type ""System.Windows.Forms.Button""
Point = luanet.import_type ""System.Drawing.Point""
MessageBox = luanet.import_type ""System.Windows.Forms.MessageBox""
MessageBoxButtons = luanet.import_type ""System.Windows.Forms.MessageBoxButtons""

form = Form()
form.Text = ""Hello, World!""
button = Button()
button.Text = ""Click Me!""
button.Location = Point(20,20)
button.Click:Add(function()
        MessageBox:Show(""Clicked!"", """", MessageBoxButtons.OK) -- this will throw an ex
    end)   
form.Controls:Add(button)
form:ShowDialog()";

        private static void Main(string[] args)
        {
            try
            {
                var lua = new Lua();
                lua.DoString(ScriptTxt);
            }
            catch(LuaException ex)
            {
                Console.WriteLine(ex.Message);
            }
            catch(Exception ex)
            {
                if (ex.Source == "LuaInterface")
                {
                    Console.WriteLine(ex.Message);
                }
                else
                {
                    throw;
                }
            }

            Console.ReadLine();
        } 

LuaInterface具有相当不错的文档,其中解释了繁琐错误处理的方法。

http://penlight.luaforge.net/packages/LuaInterface/#T6

希望它有所帮助。:)


感谢您的帖子!我差点忘了这个线程!不幸的是,我已经尝试过您的建议,但由于Lua脚本在调用一个.Net函数时失败了(例如MessageBox:Show抛出异常),所以没有成功。经过很多摆弄,我发现有一个内部异常没有通过LuaInterface正确委派。在“导出”它之后,我得到了我需要的信息,并且至少可以提供一些代码提示,我的程序崩溃了! - Tobias Boschek
值得一提的是,Nua是Lua的.NET实现,使用动态语言运行时(DLR)http://nua.codeplex.com/。Iron Python和Iron Ruby也使用DLR。它是100%的.NET框架,因此您不会遇到奇怪的封送错误。这是一个值得关注的项目。 - Jeno Laszlo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接