Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
vdix Member Откуда: Сообщений: 28 |
Коллеги, такой вопрос: есть ли какой-либо способ узнать, что в коде FastScript скрипта было вызвано обрабатываемое исключение, к примеру такое:try I := StrToInt('test'); except // узнать, что вот это произошло end; Моя задача минимум в том, чтобы в коде приложения, выполнившего скрип, хотя бы просто подсчитать, сколько произошло таких "тихих" исключений. Если это важно - скрипт выполняется из делфового приложения через Script.CallFunction(), если обернуть вызов CallFunction() в try..except то успешно обработанное скриптовое исключения, естественно, не приведёт к срабатыванию секции except в делфовом приложении. Никаких ивентов для обработки ошибок типа OnException у FastScript, судя по всему, не предусмотрено. |
18 фев 21, 19:09 [22283053] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
vdix, Добавить в скрипт глобальную переменную и увеличивать её значение в секции Exception скрипта? А потом из приложения считать её значение? |
18 фев 21, 19:13 [22283055] Ответить | Цитировать Сообщить модератору |
_Den_Z_ Member Откуда: Сообщений: 115 |
vdix, В скрипте есть две переменные ExceptionMessage и ExceptionClassName, хранят информацию о последнем исключении. |
18 фев 21, 20:53 [22283100] Ответить | Цитировать Сообщить модератору |
vdix Member Откуда: Сообщений: 28 |
Плохая идея - скрипт может писаться другими людьми, требовать объявление какой-то переменной, ещё и изменения её в каждой секции исключения - это зло потому что не учитывает, что автор скрипта может просто забыть в каком-то except-е добавить увеличение переменной.
for N := 1 to 5 do try I := StrToInt('test'); except // узнать, что вот это произошло end; |
||||
19 фев 21, 12:21 [22283379] Ответить | Цитировать Сообщить модератору |
DimaBr Member Откуда: Сообщений: 11981 |
А как бы вы в Delphi посчитали количество ошибок ? |
||
19 фев 21, 12:32 [22283393] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
1. Обявить глобальную переменную из Delphi фастскрипт не позволяет что-ли?.. Понятно что не в скрипте. 2. Если ты хочешь что-то посчитать, то тебе придётся это считать, увы. Раз разработчики не предусмотрели событие OnException - значит считать придётся в скрипте, чудес не бывает. |
||||
19 фев 21, 12:38 [22283399] Ответить | Цитировать Сообщить модератору |
vdix Member Откуда: Сообщений: 28 |
Так-то да. Думал, может класс хелпер какой сделать, но покрутил это и так, и сяк - на ум не приходит, как его реализовать. Там нужно в TfsTryStmtHelper.Execute залезть и поковыряться, но хелпер оверрайдить методы не позволяет... |
19 фев 21, 14:16 [22283505] Ответить | Цитировать Сообщить модератору |
_Den_Z_ Member Откуда: Сообщений: 115 |
vdix, Решается простой заменой переменной ExceptionMessage. type TfsExeptStringVariable = class(TfsStringVariable) private FErrors: TStrings; protected procedure SetValue(const Value: Variant); override; public procedure AfterConstruction; override; destructor Destroy; override; property Errors: TStrings read FErrors; end; procedure TfsExeptStringVariable.AfterConstruction; begin inherited; FErrors := TStringList.Create; end; destructor TfsExeptStringVariable.Destroy; begin FErrors.Free; inherited; end; procedure TfsExeptStringVariable.SetValue(const Value: Variant); begin inherited; FErrors.Add(Value); end; procedure RunScript; var cvar: TfsCustomVariable; begin Script.AddRTTI; // код должен идти после AddRTTI, если используется fsGlobalUnit то использовать его cvar := Script.Find('ExceptionMessage'); if Assigned(cvar) then begin Script.Remove(cvar); cvar.Free; cvar := TfsExeptStringVariable.Create('ExceptionMessage', fvtString, 'String'); Script.Add('ExceptionMessage', cvar); cvar.AddedBy := TObject(1); // rtti item flag end; Script.Run; cvar := Script.Find('ExceptionMessage'); if cvar is TfsExeptStringVariable then begin TfsExeptStringVariable(cvar).Errors.Count; // количество ошибок TfsExeptStringVariable(cvar).Errors.Text; //список TfsExeptStringVariable(cvar).Errors.Clear;// очистить после выполнения end; end; |
19 фев 21, 15:15 [22283532] Ответить | Цитировать Сообщить модератору |
Все форумы / Delphi | ![]() |