2013-05-23 4 views
3

В настоящее время я использую lua из консольного приложения, означает всякий раз, когда в сценарии возникает ошибка, и вызывается lua_error(), соответствующий текст печатается.Вывести вывод lua_error()?

Теперь мне нужно переместить эту штуку в графическое приложение, которое работает без консоли в фоновом режиме. Текст ошибки, который появляется, должен быть отправлен в основное приложение, чтобы он мог делать все, что ему нужно. В качестве второго пункта все приложение НЕ должно быть остановлено (как это было для консольного приложения).

Итак, мой вопрос: есть ли возможность улавливать сообщения об ошибках, указанные в lua_error(), в какой-то момент кода для дальнейшей обработки и для предотвращения остановки приложения?

ответ

3

Как указывает Lua manua, вы должны будете использовать защищенные вызовы для выполнения кода Lua из вашего приложения. Если вы столкнулись с ошибкой незащищенного вызова, Lua вызовет функцию паники, которая записывает вывод ошибки в консоль, из которой вы хотите избавиться.

В частности, lua_pcall может быть снабжен специальным обработчиком сообщений, который вызывается в случае ошибки. Вы можете предоставить настраиваемый обработчик, который взаимодействует с вашим графическим интерфейсом.

Помните, что обработчики сообщений вызывают через C-longjmp, который имеет certain implications, что вы можете и не можете сделать из обработчика сообщений.

В качестве альтернативы, не предоставляйте обработчик сообщений вообще и вместо этого проверяйте возвращаемое значение функции lua_pcall. В случае ошибки сообщение об ошибке может быть извлечено из верхней части стека Lua.

+0

Другой (и, я думаю, более простой) способ - проверить возвращаемое значение 'lua_pcall'. Если он отличается от 0, сообщение об ошибке находится прямо в стеке, вам просто нужно получить его с помощью строки lua_to (l). –

0

lua_error сам по себе не выводит никакого вывода: это приложение, которое называется Lua, которое обрабатывает сообщение об ошибке.

К пульт, предположим, вы имеете в виду, что вы используете стандартный интерпретатор командной строки Lua. Похоже, теперь вы хотите включить Lua в свое приложение. В этом случае вы используете lua_pcall для запуска сценариев Lua и проверки его возвращаемого значения, обработки любых ошибок, которые могут произойти.

Смежные вопросы