Как поймать исключение Lua в C # - PullRequest
4 голосов
/ 09 февраля 2011

Я использую сборку с именем LuaInterface для запуска lua-кода внутри моего приложения на C #. Во время выполнения lua я создаю несколько WinForms и сопоставляю им обработчики событий (lua-методы).

Проблема в том, что метод doString (он же runLuaCode) запускает только процедуру init и конструкторы. Это хорошо и предназначено, однако функция doString действует не блокирующе, поэтому функция возвращается, пока Lua-create-Forms все еще там. Это означает, что любое исключение (null-ref и т. практически невозможно.

Есть ли способ создать новый поток / процесс / домен приложения, который обрабатывает свой собственный WndProc, так что только эта подзадача должна обрабатывать исключения?

Должен ли я заблокировать мой редактор в doString с помощью цикла while в lua до закрытия форм?

Какие еще есть варианты?

Любой совет по этому вопросу с благодарностью!

1 Ответ

0 голосов
/ 22 февраля 2011

Еще один энтузиаст Lua !! В заключение! :) Мне также нравится идея использовать Lua для написания макросов в моих приложениях .NET.

Я не уверен, что понял. Я написал пример кода, и он, кажется, работает нормально. Простая попытка поймать вокруг 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

Надеюсь, это поможет. :)

...