Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Узнать, что в FastScript произошёл exception  [new]
vdix
Member

Откуда:
Сообщений: 28
Коллеги, такой вопрос: есть ли какой-либо способ узнать, что в коде FastScript скрипта было вызвано обрабатываемое исключение, к примеру такое:

try
  I := StrToInt('test');
except
  // узнать, что вот это произошло
end;


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

Если это важно - скрипт выполняется из делфового приложения через Script.CallFunction(), если обернуть вызов CallFunction() в try..except то успешно обработанное скриптовое исключения, естественно, не приведёт к срабатыванию секции except в делфовом приложении. Никаких ивентов для обработки ошибок типа OnException у FastScript, судя по всему, не предусмотрено.
18 фев 21, 19:09    [22283053]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, что в FastScript произошёл exception  [new]
alekcvp
Member

Откуда:
Сообщений: 2730
vdix,

Добавить в скрипт глобальную переменную и увеличивать её значение в секции Exception скрипта? А потом из приложения считать её значение?
18 фев 21, 19:13    [22283055]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, что в FastScript произошёл exception  [new]
_Den_Z_
Member

Откуда:
Сообщений: 115
vdix,
В скрипте есть две переменные ExceptionMessage и ExceptionClassName, хранят информацию о последнем исключении.
18 фев 21, 20:53    [22283100]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, что в FastScript произошёл exception  [new]
vdix
Member

Откуда:
Сообщений: 28
автор
Добавить в скрипт глобальную переменную и увеличивать её значение в секции Exception скрипта? А потом из приложения считать её значение?

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

автор
В скрипте есть две переменные ExceptionMessage и ExceptionClassName, хранят информацию о последнем исключении.
Такое себе подспорье, если ошибка будет происходить в цикле в одном и том же месте - это никак не поможет посчитать количество срабатываний:
for N := 1 to 5 do
try
  I := StrToInt('test');
except
  // узнать, что вот это произошло
end;
19 фев 21, 12:21    [22283379]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, что в FastScript произошёл exception  [new]
DimaBr
Member

Откуда:
Сообщений: 11981
автор
Такое себе подспорье, если ошибка будет происходить в цикле в одном и том же месте - это никак не поможет посчитать количество срабатываний

А как бы вы в Delphi посчитали количество ошибок ?
19 фев 21, 12:32    [22283393]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, что в FastScript произошёл exception  [new]
alekcvp
Member

Откуда:
Сообщений: 2730
vdix

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

1. Обявить глобальную переменную из Delphi фастскрипт не позволяет что-ли?.. Понятно что не в скрипте.
2. Если ты хочешь что-то посчитать, то тебе придётся это считать, увы. Раз разработчики не предусмотрели событие OnException - значит считать придётся в скрипте, чудес не бывает.
19 фев 21, 12:38    [22283399]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, что в FastScript произошёл exception  [new]
vdix
Member

Откуда:
Сообщений: 28
Так-то да. Думал, может класс хелпер какой сделать, но покрутил это и так, и сяк - на ум не приходит, как его реализовать. Там нужно в TfsTryStmtHelper.Execute залезть и поковыряться, но хелпер оверрайдить методы не позволяет...
19 фев 21, 14:16    [22283505]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, что в FastScript произошёл exception  [new]
_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 Ответить