FFIError - модуль обработки ошибок функций

Здесь обсуждается всё, что касается макросов.
Post Reply
IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

FFIError - модуль обработки ошибок функций

Post by IgorZ » Fri 28 Jul, 2017 10:52

Очень простенький модуль. Содержит единственную функцию, которая проверяет результат выполнения последней функции, вызванной с помощью FFI, получает расшифровку кода завершения и возвращает то и другое. Разумеется, проверять результат следует в том случае, если результат работы функции отличен от нормального (возратила признак ошибки, не возвратила корректный результат и т. п.), иначе результат, возвращаемый модулем, не имеет практического смысла.
Можно также использовать с аналогичной целью far.Message с параметром "e" (far. Message(<базовый текст сообщения>, <заголовок>, <кнопки>, "e")). Отличия данного модуля:
  • не выводит на экран ничего, что позволяет реагировать более гибко;
  • кроме текста ошибки возвращает его код, который удобен для программного анализа.
Пример использования:
  1. local ffi = require"ffi"
  2. local ffierror = require"ffierror"
  3. local C = ffi.C
  4. ffi.cdef[[
  5. HWND GetActiveWindow(VOID);
  6. ]]
  7. local wh = C.GetActiveWindow()
  8. local code,text = ffierror()
  9. if wh then
  10.   far.Show(text, "wh="..tostring(wh))
  11. else
  12.   far.Show("Error #"..code..". "..text)
  13. end
В качестве бонуса выкладываю первоначальную (пока у меня были сложности с дрессировкой FormatMessage) версию. Она содержит все коды ошибок внутри, текст ошибок только английский, зато возвращает три параметра вместо двух: код завершения, наименование кода и его расшифровку. В принципе, можно использовать как справочник.

Требуемая версия Far 3.0.3001+.

Attachments
ffierror.1.0.1.7z
(1.17 KiB) Downloaded 17 times
ffierror.0.1.7z
(72.38 KiB) Downloaded 15 times
Last edited by IgorZ on Mon 31 Jul, 2017 06:10, edited 2 times in total.

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

FFIError - модуль обработки ошибок функций

Post by IgorZ » Fri 28 Jul, 2017 10:56

Наваяно в связи с непонятным поведением некоторых функций и необходимостью проверять результаты их исполнения.

User avatar
John Doe
Бюрократ
Posts: 11415
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

FFIError - модуль обработки ошибок функций

Post by John Doe » Fri 28 Jul, 2017 12:26

IgorZ wrote:
Fri 28 Jul, 2017 10:52
проверяет результат выполнения последней функции, вызванной с помощью FFI
Не совсем корректная формулировка. Можно показаться будто (1) GetLastError только от ffi зависит и (2) любой вызов ffi должен установить какой-то код ошибки.

Поэтому хочу уточнить, что ожидать код ошибки стоит только в тех случаях, когда об этом явно сказано в MSDN.
Причём не всегда в случае отсутствия ошибки код будет 0, иногда успех надо определять по возвращаемому значению функции, и только в случае ошибки обращаться к GetLastError (в противном случае мы прочитаем код какой-то ошибки, оставшийся от какого-то прошлого вызова совершенно другой функции, не нами даже вызванной).
Собственно, я только что пересказал описание из MSDN

Также хочу обратить внимание, что подобная функциональность уже есть, в функции Message (FMSG_ERRORTYPE)

User avatar
John Doe
Бюрократ
Posts: 11415
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

FFIError - модуль обработки ошибок функций

Post by John Doe » Fri 28 Jul, 2017 12:51

В lua в простейшем случае это так: far.Message("",nil,nil,"ew")
Для примера кусок кода:

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

FFIError - модуль обработки ошибок функций

Post by IgorZ » Mon 31 Jul, 2017 05:33

*грустно* Про такую функциональность far.Message я и забыл... Куча времени потрачена практически впустую... Эх!
Ладно, спасибо за подсказку. Описание тоже подправлю, для порядка.
Last edited by IgorZ on Mon 31 Jul, 2017 06:15, edited 1 time in total.

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

FFIError - модуль обработки ошибок функций

Post by IgorZ » Mon 31 Jul, 2017 06:14

Подумав, решил, что раз уж выложил, то надо поправить в соответствии с. Так что
Версия 1.0.1 - Добавлено определение malloc() и free(). Дополнено Info.

Post Reply

Return to “Обсуждение макросов”