Можно ли сделать в квике режим, чтобы luaL_error не останавливала скрипт

Страницы: 1
RSS
Можно ли сделать в квике режим, чтобы luaL_error не останавливала скрипт
 
1. Можно ли сделать в квике режим (errorstop=true/false), чтобы luaL_error не останавливала скрипт, а выводила ошибку в окно "Ошибки выполнения скрипта"
2. Сообщения переданные в message с icon_type также отображались в окне "Ошибки выполнения скрипта"
 
Цитата
Александр написал:
чтобы luaL_error не останавливала скрипт
По дизайну lua_error не должна возвращать управление. Отсюда следует, что она сразу ломает (как минимум) тот блок, в котором была вызвана. Отсюда следует ответ, что продолжить выполнение с места вызова lua_error в принципе невозможно, блок уже сломан, состояние потеряно. Но вы сами можете поймать ошибку с помощью pcall и дальше уже решить, продолжать или нет.
 
Цитата
Anton написал:
Цитата
Александр написал:
чтобы luaL_error не останавливала скрипт
По дизайну lua_error не должна возвращать управление. Отсюда следует, что она сразу ломает (как минимум) тот блок, в котором была вызвана. Отсюда следует ответ, что продолжить выполнение с места вызова lua_error в принципе невозможно, блок уже сломан, состояние потеряно. Но вы сами можете поймать ошибку с помощью pcall и дальше уже решить, продолжать или нет.
Могу поймать, но тогда нет возможности вывести сообщение об ошибке в окно "Ошибки выполнения скрипта". Сообщения об ошибках в этом окне более информативны.
 
Цитата
Александр написал:
Сообщения об ошибках в этом окне более информативны.
Они дословно те же самые, что в окне сообщений, разве нет? Тут подмывает пошутить типа "а зачем вы пишете скрипты с ошибками", но я по-другому сформулирую: не первый раз вижу, что люди рассматривают ошибку в скрипте как один из допустимых путей. Это в корне неправильный подход, ошибка в скрипте - это конец, этого не должно случаться никогда, кроме как в процессе разработки. Там, где теоретически возможны ошибочные ситуации, надо или проверять возвраты функций, или использовать pcall (и в случае ошибки обязательно убеждаться, что поймали именно ожидаемую, а не что-то еще, прежде чем принять решение о продолжении выполнения), все остальное должно немедленно крэшить скрипт, потому что он неизвестно что делает. При этом есть еще направление "зачистка при ошибке", когда нам, в общем-то, все равно, какая именно ошибка случилась, наша задача сохранить консистентность внешнего по отношению к скрипту состояния, а дальше все тот же крэш. Вот с учетом всего изложенного ваш вопрос номер раз выглядит странно. А номер два - нормально, удобная фича могла бы быть.
 
Цитата
Anton написал:
Цитата
Александр написал:
Сообщения об ошибках в этом окне более информативны.
Они дословно те же самые, что в окне сообщений, разве нет? Тут подмывает пошутить типа "а зачем вы пишете скрипты с ошибками", но я по-другому сформулирую: не первый раз вижу, что люди рассматривают ошибку в скрипте как один из допустимых путей. Это в корне неправильный подход, ошибка в скрипте - это конец, этого не должно случаться никогда, кроме как в процессе разработки. Там, где теоретически возможны ошибочные ситуации, надо или проверять возвраты функций, или использовать pcall (и в случае ошибки обязательно убеждаться, что поймали именно ожидаемую, а не что-то еще, прежде чем принять решение о продолжении выполнения), все остальное должно немедленно крэшить скрипт, потому что он  неизвестно что  делает. При этом есть еще направление "зачистка при ошибке", когда нам, в общем-то, все равно,  какая именно  ошибка случилась, наша задача сохранить консистентность внешнего по отношению к скрипту состояния, а дальше все тот же крэш. Вот с учетом всего изложенного ваш вопрос номер раз выглядит странно. А номер два - нормально, удобная фича могла бы быть.
Как раз есть проблема очистки после ошибки. Квик прибивает скрипт, в итоге после ошибки происходят утечки данных в самописных библиотеках.
 
Цитата
Александр написал:
1. Можно ли сделать в квике режим (errorstop=true/false), чтобы luaL_error не останавливала скрипт, а выводила ошибку в окно "Ошибки выполнения скрипта"
2. Сообщения переданные в message с icon_type также отображались в окне "Ошибки выполнения скрипта"
Добрый день.


Как мы поняли Вы хотите именно сообщение в окне запуска скриптов выводит, в текущей реализации такой возможности нет. Только функция message() есть. Можем зарегистрировать пожелание на добавление функции вывода сообщений в основное окно запуска скриптов.
 
Цитата
Александр написал:
Квик прибивает скрипт, в итоге после ошибки происходят утечки данных в самописных библиотеках.
Да, такое было от 8.2 (если не ошибаюсь) и до 8.5 включительно, в 8.6 поправили и из мейна выходит с очисткой. Колбеки надо заворачивать в pcall и при ошибке прибиваться самостоятельно, квик даже теоретически не имеет возможности прибить мейн кроме как через TerminateThread, а это еще хуже, чем игнорировать ошибки в колбеках. Чтобы это дело четко отработать на всех этапах, надо:
1) создать глобальную табличку с метаметодом __gc.
2) ошибку в OnInit ловим pcall'ом и откладываем до мейна (сохраняем хоть в ту же глобальную табличку).
3) все колбеки заворачиваем в pcall, ошибку из любого колбека редиректим в мейн и либо ставим глобальный флаг "игнорировать колбеки", либо заменяем их все на заглушки.
4) в мейне первым делом проверяем, не было ли ошибки в OnInit (сохранена в п.2), если была - бросаем ее же снова уже из мейна.
5) далее у меня почти всегда цикл сообщений, иногда ожидание на объектах, так что как редиректить ошибку из колбека проблемы нет; по получении ошибки опять же просто кидаем ее снова уже из мейна.
6) ну и зачистка в __gc из п.1 всегда одна и та же, хоть там ошибка, хоть там нормальное завершение.
 
Цитата
Egor Zaytsev написал:
Цитата
Александр написал:
1. Можно ли сделать в квике режим (errorstop=true/false), чтобы luaL_error не останавливала скрипт, а выводила ошибку в окно "Ошибки выполнения скрипта"
2. Сообщения переданные в message с icon_type также отображались в окне "Ошибки выполнения скрипта"
Добрый день.


Как мы поняли Вы хотите именно сообщение в окне запуска скриптов выводит, в текущей реализации такой возможности нет. Только функция message() есть. Можем зарегистрировать пожелание на добавление функции вывода сообщений в основное окно запуска скриптов.
Да, это было бы замечательно
 
Цитата
Александр написал:
Цитата
Egor Zaytsev написал:
 
Цитата
Александр  написал:
1. Можно ли сделать в квике режим (errorstop=true/false), чтобы luaL_error не останавливала скрипт, а выводила ошибку в окно "Ошибки выполнения скрипта"
2. Сообщения переданные в message с icon_type также отображались в окне "Ошибки выполнения скрипта"
 Добрый день.


Как мы поняли Вы хотите именно сообщение в окне запуска скриптов выводит, в текущей реализации такой возможности нет. Только функция message() есть. Можем зарегистрировать пожелание на добавление функции вывода сообщений в основное окно запуска скриптов.
Да, это было бы замечательно

Ваше пожелание зарегистрировано.  Мы постараемся рассмотреть его и  сообщить Вам результаты анализа. Впоследствии, по результатам анализа,  будет приниматься решение о реализации пожелания в будущих версиях ПО.
Страницы: 1
Читают тему
Наверх