2011-02-09 104 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

我希望它能幫助。 :)