Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Узнать, что в FastScript произошёл exception / 8 сообщений из 8, страница 1 из 1
18.02.2021, 19:09
    #40046843
vdix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать, что в FastScript произошёл exception
Коллеги, такой вопрос: есть ли какой-либо способ узнать, что в коде FastScript скрипта было вызвано обрабатываемое исключение, к примеру такое:

Код: pascal
1.
2.
3.
4.
5.
try
  I := StrToInt('test');
except
  // узнать, что вот это произошло
end;



Моя задача минимум в том, чтобы в коде приложения, выполнившего скрип, хотя бы просто подсчитать, сколько произошло таких "тихих" исключений.

Если это важно - скрипт выполняется из делфового приложения через Script.CallFunction(), если обернуть вызов CallFunction() в try..except то успешно обработанное скриптовое исключения, естественно, не приведёт к срабатыванию секции except в делфовом приложении. Никаких ивентов для обработки ошибок типа OnException у FastScript, судя по всему, не предусмотрено.
...
Рейтинг: 0 / 0
18.02.2021, 19:13
    #40046845
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать, что в FastScript произошёл exception
vdix,

Добавить в скрипт глобальную переменную и увеличивать её значение в секции Exception скрипта? А потом из приложения считать её значение?
...
Рейтинг: 0 / 0
18.02.2021, 20:53
    #40046881
_Den_Z_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать, что в FastScript произошёл exception
vdix,
В скрипте есть две переменные ExceptionMessage и ExceptionClassName, хранят информацию о последнем исключении.
...
Рейтинг: 0 / 0
19.02.2021, 12:21
    #40047073
vdix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать, что в FastScript произошёл exception
авторДобавить в скрипт глобальную переменную и увеличивать её значение в секции Exception скрипта? А потом из приложения считать её значение?
Плохая идея - скрипт может писаться другими людьми, требовать объявление какой-то переменной, ещё и изменения её в каждой секции исключения - это зло потому что не учитывает, что автор скрипта может просто забыть в каком-то except-е добавить увеличение переменной.

авторВ скрипте есть две переменные ExceptionMessage и ExceptionClassName, хранят информацию о последнем исключении.Такое себе подспорье, если ошибка будет происходить в цикле в одном и том же месте - это никак не поможет посчитать количество срабатываний:
Код: pascal
1.
2.
3.
4.
5.
6.
for N := 1 to 5 do
try
  I := StrToInt('test');
except
  // узнать, что вот это произошло
end;
...
Рейтинг: 0 / 0
19.02.2021, 12:32
    #40047083
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать, что в FastScript произошёл exception
авторТакое себе подспорье, если ошибка будет происходить в цикле в одном и том же месте - это никак не поможет посчитать количество срабатываний
А как бы вы в Delphi посчитали количество ошибок ?
...
Рейтинг: 0 / 0
19.02.2021, 12:38
    #40047088
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать, что в FastScript произошёл exception
vdix

Плохая идея - скрипт может писаться другими людьми, требовать объявление какой-то переменной, ещё и изменения её в каждой секции исключения - это зло потому что не учитывает, что автор скрипта может просто забыть в каком-то except-е добавить увеличение переменной.

1. Обявить глобальную переменную из Delphi фастскрипт не позволяет что-ли?.. Понятно что не в скрипте.
2. Если ты хочешь что-то посчитать, то тебе придётся это считать, увы. Раз разработчики не предусмотрели событие OnException - значит считать придётся в скрипте, чудес не бывает.
...
Рейтинг: 0 / 0
19.02.2021, 14:16
    #40047140
vdix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать, что в FastScript произошёл exception
Так-то да. Думал, может класс хелпер какой сделать, но покрутил это и так, и сяк - на ум не приходит, как его реализовать. Там нужно в TfsTryStmtHelper.Execute залезть и поковыряться, но хелпер оверрайдить методы не позволяет...
...
Рейтинг: 0 / 0
19.02.2021, 15:15
    #40047163
_Den_Z_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать, что в FastScript произошёл exception
vdix,
Решается простой заменой переменной ExceptionMessage.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
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;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Узнать, что в FastScript произошёл exception / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]