2011-02-09 5 views
4

J'utilise un assembly nommé LuaInterface pour exécuter lua-code dans mon application C#. Pendant l'exécution de lua, je crée des gestionnaires d'événements de carte WinForms & (méthodes lua).Comment attraper une exception Lua en C#

Le problème est que la méthode doString (alias runLuaCode) exécute uniquement la routine init et les constructeurs. C'est bien et prévu, cependant la fonction doString agit non bloquante donc la fonction retourne alors que les Lua-created-Forms sont toujours là. Cela signifie que toute exception (null-ref et alike) qui n'est pas levée pendant le constructeur n'est pas gérée par l'erreur lua traitant un crash jusqu'à mon wndProc de mon éditeur - qui tue probablement mon éditeur et gère les erreurs virtuellement impossible.

Est-il possible de créer un nouveau Thread/Process/AppDomain qui gère son propre WndProc de sorte que seule cette sous-tâche doit gérer les exceptions?

Dois-je bloquer mon éditeur sur doString avec une boucle while dans lua jusqu'à ce que les formulaires soient fermés?

Quelles autres options ai-je?

Tout conseil à ce sujet est grandement apprécié!

+0

désolé - je ne comprends pas? – Corelgott

+0

Oo - woop je vois ... ce n'était pas intentionnel - désolé et merci pour l 'indice - rappel à moi - rtfm – Corelgott

+0

Il n'est pas tard pour résoudre ce problème ;-) –

Répondre

0

Un autre passionné de Lua !! Finalement! :) Je suis également en train de jouer avec l'idée d'utiliser Lua pour les scripts macro dans mes applications .NET.

Je ne suis pas sûr de l'avoir. J'ai écrit un exemple de code et cela semble fonctionner correctement. Essayez simplement attraper autour de DoString obtient les LuaExceptions. DoString bloque le thread principal sauf si vous créez explicitement un nouveau thread. Dans le cas d'un nouveau thread, les règles de gestion des exceptions multithread .NET normales s'appliquent.

Exemple:

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 a une très bonne documentation où la gestion des erreurs délicate est expliquée.

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

J'espère que cela aide. :)

+0

Merci pour votre publication! J'ai presque oublié le fil! Malheureusement, j'ai déjà essayé votre suggestion sans succès, en raison des échecs de script lua dans une fonction .Net appelé. (si par exemple MessageBox: Show déclenche une exception) Après beaucoup de fiddeling, j'ai découvert qu'il existe une exception interne qui n'a pas été correctement déléguée via LuaInterface. Après l'avoir "exporté", j'ai obtenu mes informations requises et je peux au moins fournir un coup de code où mon programme s'est écrasé! – Corelgott

+0

Il vaut la peine de vérifier Nua qui est une implémentation .NET de Lua et utilise le Dynamic Language Runtime (DLR) http://nua.codeplex.com/ Iron Python et Iron Ruby utilisent également le DLR. Il s'agit d'un framework 100% .NET, donc vous ne rencontrerez pas d'erreurs de triage exotiques. C'est un projet qui mérite d'être suivi. –

Questions connexes