добавить onerror функцию, как стандартный элемент макроса

Вам не хватает чего-то в Far? Вы считаете, что вашу идею стоит услышать? Пишите сюда.
Post Reply
User avatar
citRiks
Posts: 1426
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 435 times
Been thanked: 90 times

добавить onerror функцию, как стандартный элемент макроса

Post by citRiks »

Предлагаю добавить onerror функцию, как стандартный необязательный элемент макроса.
Это когда происходит непойманное исключение, "большое красное окошко".
Например позволит останавливать исполнение "свихнувшегося" макроса,
в ситуации например, когда может быть заблокировать весь ФАР и выход только "через окно" (hard kill)
Например может логгировать/анализировать происходящее.
Я применений вижу много, самому себе думаю что сделаю в любом случае.

Code: Select all

Macro { description = "some description here"; 
	area = "Editor"; 
	key = "ShiftBS"; 
	condition = function(...) print("what?") end;
	action = function(...) print("whatever!") end;
	-- proposed kind of callback handler on error:
	onerror = function(...) print("Failed ..") end;
}
Если у кого-то из разрабов появится интерес, можно обсудить что будет получать и возвращать функция, и модели поведения ФАРа в результате
Last edited by citRiks on Tue 04 May, 2021 16:53, edited 1 time in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2827
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 153 times
Been thanked: 404 times
Contact:

добавить onerror функцию, как стандартный элемент макроса

Post by buniak_a_h »

citRiks wrote: Tue 04 May, 2021 16:33 позволит останавливать исполнение "свихнувшегося" макроса,
в ситуации например, когда может быть заблокировать весь ФАР
Осталось придумать, как отличить зациклившийся макрос от просто долго исполняющегося…
User avatar
citRiks
Posts: 1426
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 435 times
Been thanked: 90 times

добавить onerror функцию, как стандартный элемент макроса

Post by citRiks »

buniak_a_h,
я имел ввиду вылет по ошибке, уже сейчас это (обычный выход тоже?) обрабатывает внутренняя функция FixReturn,
поэтому технически нетрудно передать управление в случае ошибки в соответствующий error handler соответствущего макроса.

Code: Select all

local function FixReturn (handle, ok, ...)
  local ret1, ret_type = ...
  if ok then
    local status = co_status(handle.coro)
    if status == "suspended" and ret1 == PROPAGATE and ret_type ~= "exit" then
      handle._store = pack(select(3, ...))
      return ret_type, handle._store
    else
      return F.MPRT_NORMALFINISH, pack(true, ...)
    end
  else
    local msg = type(ret1)=="string" and ret1 or "(error object is not a string)"
    msg = string.gsub(debug.traceback(handle.coro, msg), "\n\t", "\n   ")
    ErrMsg(msg)
    return F.MPRT_ERRORFINISH
  end
end
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2827
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 153 times
Been thanked: 404 times
Contact:

добавить onerror функцию, как стандартный элемент макроса

Post by buniak_a_h »

citRiks wrote: Tue 04 May, 2021 16:49 я имел ввиду вылет по ошибке
Пока я не сталкивался с вылетом по ошибке, приводящим к ситуации, когда можно только hard kill. Скорее, наоборот, сталкивался часто с вылетом, приводящим к краху всего ФАРа. А вот с идиотскими зацикливаниями, приводящими действительно к hard kill - регулярно.
User avatar
citRiks
Posts: 1426
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 435 times
Been thanked: 90 times

добавить onerror функцию, как стандартный элемент макроса

Post by citRiks »

buniak_a_h wrote: Tue 04 May, 2021 17:04 Пока я не сталкивался с вылетом по ошибке, приводящим к ситуации, когда можно только hard kill.
Ну не знаю, у меня постоянно. вызов функции по неправильному имени, ожидаемая таблица оказалось НИЛом, - все вылетаем.
и если этот вылет оказался наприме в обработке многочисленных евентов или в таймере - то "ой"
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
John Doe
Бюрократ
Posts: 13199
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 45 times
Been thanked: 334 times

добавить onerror функцию, как стандартный элемент макроса

Post by John Doe »

citRiks wrote: Tue 04 May, 2021 16:33 Предлагаю добавить onerror функцию, как стандартный необязательный элемент макроса.
И что вы там будете делать?

А на багтрекере вот такое есть: https://bugs.farmanager.com/view.php?id=2416
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1426
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 435 times
Been thanked: 90 times

добавить onerror функцию, как стандартный элемент макроса

Post by citRiks »

John Doe wrote: Tue 04 May, 2021 17:51 И что вы там будете делать?
citRiks wrote: Tue 04 May, 2021 16:33 Например позволит останавливать исполнение "свихнувшегося" макроса,
в ситуации например, когда может быть заблокировать весь ФАР и выход только "через окно" (hard kill)
Например может логгировать/анализировать происходящее.
С чем могу согласиться, так это с тем,
что можно придумать много костылей и строк кода для того чтобы реализовать это и без этого предложения.
хотя проще наверное будет сделать форк ..
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
John Doe
Бюрократ
Posts: 13199
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 45 times
Been thanked: 334 times

добавить onerror функцию, как стандартный элемент макроса

Post by John Doe »

citRiks wrote: Thu 06 May, 2021 21:09 Например позволит останавливать исполнение "свихнувшегося" макроса,
Например что именно для этого вы сделаете в этой гипотетической функции?
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1426
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 435 times
Been thanked: 90 times

добавить onerror функцию, как стандартный элемент макроса

Post by citRiks »

John Doe wrote: Thu 06 May, 2021 21:59 Например что именно для этого вы сделаете в этой гипотетической функции?
Например поставлю флажок "остановить исполнение",
будем проверять его в condition() и/или в action().
И/или выдать какое-то сообщение специфичное для именно этого макроса,
или диалог какой-то, где например решим что делать - "остановить", "еще раз", "перезагрузить"
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
citRiks
Posts: 1426
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 435 times
Been thanked: 90 times

добавить onerror функцию, как стандартный элемент макроса

Post by citRiks »

buniak_a_h wrote: Tue 04 May, 2021 16:44 Осталось придумать, как отличить зациклившийся макрос от просто долго исполняющегося…
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
John Doe
Бюрократ
Posts: 13199
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 45 times
Been thanked: 334 times

добавить onerror функцию, как стандартный элемент макроса

Post by John Doe »

citRiks wrote: Fri 07 May, 2021 06:07 будем проверять его в condition() и/или в action().
Так толку не будет, смысл есть лишь если это автоматически будет проверяться.
Вот попробуйте реализовать эти 2 вещи: найти макрос к которому относится ошибка, и запретить его запуск.
Обнаружите что поля debug тут недостаточно, и надо лезть поглубже в кишочки луамакро.
А следом обнаружите что запретить запуск тоже мало, так чаще необходимо прервать исполнение на середине.
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1426
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 435 times
Been thanked: 90 times

добавить onerror функцию, как стандартный элемент макроса

Post by citRiks »

John Doe wrote: Fri 07 May, 2021 06:46 Так толку не будет, смысл есть лишь если это автоматически будет проверяться.
Так это я и имел ввиду, проверять автоматически.
Или же я не понял ваш ответ?
Вот попробуйте реализовать эти 2 вещи: найти макрос к которому относится ошибка, и запретить его запуск.
Обнаружите что поля debug тут недостаточно, и надо лезть поглубже в кишочки луамакро.
Ну я уже прикидывал, вроде можно это все, используя уже существующие MacroState, MacroQueue, FixReturn.
А следом обнаружите что запретить запуск тоже мало, так чаще необходимо прервать исполнение на середине.
А проверяющая корутина не помогет тута?
Last edited by citRiks on Fri 07 May, 2021 13:27, edited 2 times in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
John Doe
Бюрократ
Posts: 13199
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 45 times
Been thanked: 334 times

добавить onerror функцию, как стандартный элемент макроса

Post by John Doe »

citRiks wrote: Fri 07 May, 2021 13:26 проверять автоматически
Автоматически будет если не надо будет вручную кондишны приписывать.
citRiks wrote: Fri 07 May, 2021 13:26 А проверяющая корутина не помогет тута?
На мантисе уже 10 лет висит тикет про CtrlBreak, дерзайте.
https://t.me/FarManager — Telegram чат
Post Reply

Return to “Предложения и идеи”