Exception

lvilvi
отредактировано 16:46 Раздел: FastScript
try
....
exception
Вот тута - как узнать сообщение об ошибке
end;

Пока только можно просто заглушить ошибку, а как её выловить сообщение ?

Комментарии

  • отредактировано 16:46
    Никак - конструкции on e: exception не предусмотрено.
  • lvilvi
    отредактировано 16:46
    А можно ведь как то внутри проги (самого) FastScript при отлавливании Exception заносить в переменную и повторять его ?
  • отредактировано 16:46
    >>>>А можно ведь как то внутри проги (самого) FastScript при отлавливании >>>>Exception заносить в переменную и повторять его ?

    Можно но весьма специфичным подходом -
    для этого нужно вносить изменения в unit fs_iinterpreter;

    1. Изменить место:

    function fsGlobalUnit: TfsScript;
    function fsEventList: TfsEventList;

    implementation


    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    на:

    function fsGlobalUnit: TfsScript;
    function fsEventList: TfsEventList;

    var
    LastException: Exception; // !!!!!!

    implementation


    2. Изменить:

    procedure TfsTryStmt.Execute;
    var
    SaveExitCalled: Boolean;
    begin
    RunLine;
    if FProgram.FTerminated then
    Exit;
    if IsExcept then
    begin
    try
    inherited Execute;
    except
    on E: Exception do // !!!!!! Измения
    begin
    LastException.Message := E.Message;
    ExceptStmt.Execute;
    end;
    end;

    3. Изменить:

    initialization
    fsGlobalUnit;
    fsEventList;
    FGlobalUnitDestroyed := False;
    LastException := Exception.Create(''); // !!!!!!

    finalization
    FGlobalUnit.Free;
    FGlobalUnit := nil;
    FEventList.Free;
    FEventList := nil;
    FGlobalUnitDestroyed := True;
    LastException.Free; // !!!!!!



    Ну и соответствующим образом импортнуть все это:


    unit fs_add;

    interface

    uses SysUtils, Classes, fs_iinterpreter, fs_xml;

    implementation

    type
    TFunctions = class(TObject)
    private
    function CallMethod2(Instance: TObject; ClassType: TClass;
    const MethodName: string; var Params: Variant): Variant;
    function GetProp(Instance: TObject; ClassType: TClass;
    const PropName: string): Variant;
    procedure SetProp(Instance: TObject; ClassType: TClass;
    const PropName: string; Value: Variant);
    public
    constructor Create;
    destructor Destroy; override;
    end;

    var
    Functions: TFunctions;

    constructor TFunctions.Create;
    begin
    with fsGlobalUnit do
    begin
    AddedBy := Self;
    // Exception
    with AddClass(Exception, 'TObject') do
    AddProperty('Message', 'String', GetProp, SetProp);
    AddMethod('function LastException: Exception', CallMethod2, 'System');
    AddMethod('procedure Raise(Message: String)', CallMethod2, 'System');
    AddedBy := nil;
    end;
    end;

    function TFunctions.CallMethod2(Instance: TObject; ClassType: TClass;
    const MethodName: string; var Params: Variant): Variant;
    begin
    if MethodName = 'LASTEXCEPTION' then
    Result := Integer(LastException)
    else if MethodName = 'RAISE' then
    begin
    LastException.Message := string(Params[0]);
    raise Exception.Create(Params[0]);
    end;
    end;

    destructor TFunctions.Destroy;
    begin
    if fsGlobalUnit <> nil then
    fsGlobalUnit.RemoveItems(Self);
    inherited;
    end;

    function TFunctions.GetProp(Instance: TObject; ClassType: TClass;
    const PropName: string): Variant;
    begin
    if ClassType = Exception then
    begin
    if PropName = 'MESSAGE' then
    Result := Exception(Instance).Message;
    end;
    end;

    procedure TFunctions.SetProp(Instance: TObject; ClassType: TClass;
    const PropName: string; Value: Variant);
    begin
    if ClassType = Exception then
    begin
    if PropName = 'MESSAGE' then
    Exception(Instance).Message := Value;
    end
    end;

    initialization
    Functions := TFunctions.Create;

    finalization
    Functions.Free;

    end.


    Теперь появилась некоторая упрошенная аналогия рабюты с исключениями:
    Пример скрипта:

    var
    i: integer;
    s: string;
    begin
    try
    Raise('Test') ; // Возбуждаем тестовое исключение
    except
    ShowMessage(LastException.Message);
    end;
    try
    i := 1/0;
    except
    ShowMessage(LastException.Message);
    end;
    end.




  • lvilvi
    отредактировано 16:46
    Спасибо - попробую
  • отредактировано 16:46
    Да надо отметить что вносить подобные измения не совсем коректно.
    Могут возникнуть трудности при выходе новых версий.
    Поэтому рекомендуется такие места отмечать особо типа // !!!!!!!
    Что бы их потом найти, либо пользоваться тулсами типа Araxis Merge, либо другими софтинами позволяющие сравнивать версии файлов.
  • отредактировано 16:46
    тема открыта была в 2004 году, а сейчас можно как-нибудь выловить ошибку, а не глушить ее?
  • отредактировано 16:46
    Marionka написал: »
    тема открыта была в 2004 году, а сейчас можно как-нибудь выловить ошибку, а не глушить ее?

    Можно в скрипте есть две глобальные переменные ExceptionClassName - класс ошибки, ExceptionMessage - сообщение.


    Пример:
    var
    i: extended;                                     
    begin
    try            
      i := 1/0;                
    except              
      ShowMessage(ExceptionClassName + ': '  + ExceptionMessage);
    end;          
    end.
    

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.