2011-02-09 69 views
4

我正在使用名为LuaInterface的程序集在我的C#应用​​程序中运行lua-code。在lua执行期间,我为它们创建了一些WinForms &地图事件处理程序(lua-methods)。如何捕捉C#中的Lua异常#

问题是,doString(又名runLuaCode)方法只运行init例程和构造函数。这很好,但是doString函数的行为是非阻塞的,所以当Lua创建的表单仍然存在时,函数会返回。这意味着在构造函数中不会产生的任何异常(null-ref和alike)不会由lua错误处理来处理,一直到我编辑器的wndProc都崩溃 - 这很可能会杀死我的编辑器并进行错误处理几乎不可能。

有什么办法来创建一个新的线程/进程/ AppDomain来处理它自己的WndProc,以便只有这个子任务需要处理异常?

我应该在doString中封锁我的编辑器,并在lua中加入while循环,直到窗体关闭?

我还有其他选择吗?

有关此事的任何建议非常感谢!

+0

对不起 - 我不明白吗? – Corelgott 2011-02-09 08:41:36

+0

Oo - woop我看到了...这不是故意 - 抱歉&thx的提示 - 提醒自己 - rtfm – Corelgott 2011-02-09 09:57:32

回答

0

另一个Lua爱好者!最后! :)我也玩弄了在我的.NET应用程序中使用Lua进行宏脚本编写的想法。

我不知道我明白了。我写了一些示例代码,它似乎工作正常。简单尝试捕捉DoString获取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

我希望它能帮助。 :)