Exception
try
....
exception
Вот тута - как узнать сообщение об ошибке
end;
Пока только можно просто заглушить ошибку, а как её выловить сообщение ?
....
exception
Вот тута - как узнать сообщение об ошибке
end;
Пока только можно просто заглушить ошибку, а как её выловить сообщение ?
Комментарии
Можно но весьма специфичным подходом -
для этого нужно вносить изменения в 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.
Могут возникнуть трудности при выходе новых версий.
Поэтому рекомендуется такие места отмечать особо типа // !!!!!!!
Что бы их потом найти, либо пользоваться тулсами типа Araxis Merge, либо другими софтинами позволяющие сравнивать версии файлов.
Можно в скрипте есть две глобальные переменные ExceptionClassName - класс ошибки, ExceptionMessage - сообщение.
Пример: