//
unit ads_Exception;
{Copyright(c)2016 Advanced Delphi Systems
Richard Maley
Advanced Delphi Systems
12613 Maidens Bower Drive
Potomac, MD 20854 USA
phone 301-840-1554
dickmaley@advdelphisys.com
The code herein can be used or modified by anyone. Please retain references
to Richard Maley at Advanced Delphi Systems. If you make improvements to the
code please send your improvements to dickmaley@advdelphisys.com so that the
entire Delphi community can benefit. All comments are welcome.
}
(*UnitIndex Master Index Implementation Section Download UnitsDescription: ads_Exception.pas This unit contains the following routines.
GetFileSize RaiseError SaveErrorLog SetProcName TrimErrorLog UserIDFromWindows
*)
interface
Uses
SysUtils
,Classes
{$IFDEF MSWINDOWS}, Windows{$ENDIF}
;
Procedure RaiseError(UnitName,ProcName:String;E : Exception);
Procedure SaveErrorLog;
Procedure SetProcName(var p,ProcName);
Var
LogErrors : Boolean;
LogAppFlow : Boolean = False;
RaiseErrors : Boolean;
ErrorLogFileName : String;
RaiseErrorInit : Procedure;
RaiseErrorHandle : Function(UnitName,ProcName:String;E : Exception): Boolean;
RaiseErrorLast : Procedure;
ErrorLogSizeLimit : Int64;
SaveToFileEveryNErrors : Integer;
LastError : String;
implementation
Const UnitName = 'ads_Exception';
Var
ErrorLog : TStringList;
ProcName : String;
//Unit Description UnitIndex Master IndexProcedure SetProcName(var p,ProcName); Begin End; //Unit Description UnitIndex Master Index
Function UserIDFromWindows: string;
{$IFDEF MSWINDOWS}
Var
UserName : string;
UserNameLen : Dword;
{$ENDIF}
Begin
Result := 'Unknown';
{$IFDEF MSWINDOWS}
UserNameLen := 255;
SetLength(userName, UserNameLen);
If GetUserName(PChar(UserName), UserNameLen) Then
Result := Copy(UserName,1,UserNameLen - 1)
Else
Result := 'Unknown';
{$ENDIF}
End;
//Unit Description UnitIndex Master Index
function GetFileSize(const FileName: string): LongInt;
Var
SearchRec: TSearchRec;
sgPath : String;
inRetval : Integer;
begin
sgPath := ExpandFileName(FileName);
Try
inRetval := FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec);
If inRetval = 0 Then
Result := SearchRec.Size
Else Result := -1;
Finally
SysUtils.FindClose(SearchRec);
End;
end;
//Unit Description UnitIndex Master Index
Procedure RaiseError(UnitName,ProcName:String;E : Exception);
Var
sgErr : String;
boHandled : Boolean;
Begin
If Assigned(RaiseErrorInit) Then RaiseErrorInit;
If Assigned(RaiseErrorHandle) Then
Begin
boHandled := RaiseErrorHandle(UnitName,ProcName,E);
If boHandled Then Exit;
End;
If LogErrors Then
Begin
sgErr := E.Message;
sgErr := StringReplace(sgErr,#13,'',[rfReplaceall]);
sgErr := StringReplace(sgErr,#10,'',[rfReplaceall]);
ErrorLog.Add(FormatDateTime('yyyymmddhhnnss',now())+' '+UnitName+'.'+Procname+' error: '+sgErr);
If ErrorLog.Count > SaveToFileEveryNErrors Then
Begin
SaveErrorLog;
ErrorLog.Clear;
End;
End;
If RaiseErrors Then Raise Exception.Create(UnitName+'.'+Procname+' error: '+sgErr);
If Assigned(RaiseErrorLast) Then RaiseErrorLast;
End;//{|end }
//Unit Description UnitIndex Master Index
Procedure TrimErrorLog(lst : TStringList);
Var
inCounter : Integer;
ProcName : String;
boBreak : Boolean;
begin
ProcName := 'TrimErrorLog'; Try
boBreak := False;
inCounter := 1;
While True Do
Begin
If Length(lst.Text) > ErrorLogSizeLimit Then
Begin
lst.Delete(lst.Count-1);
End
Else
Begin
boBreak := True;
End;
inc(inCounter);
If boBreak Then Break;
If inCounter > 1000 Then Break;
If lst.Count < 10 Then Break;
End;
If lst.Count > 1 Then
Begin
lst.SaveToFile(ErrorLogFileName);
End
Else
Begin
If lst.Count = 1 Then
Begin
If Trim(lst[0]) <> '' Then lst.SaveToFile(ErrorLogFileName);
End;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
//Unit Description UnitIndex Master Index
Procedure SaveErrorLog;
Var
lst : TStringList;
inCounter : Integer;
ProcName : String;
sgPath : String;
begin
ProcName := 'SaveErrorLog'; Try
lst := TStringList.create();
Try
sgPath := ExtractFilePath(ErrorLogFileName);
If Not DirectoryExists(sgPath) Then ForceDirectories(sgPath);
lst.Clear;
If FileExists(ErrorLogFileName) Then
lst.LoadFromFile(ErrorLogFileName);
ErrorLog.SetText(PChar(ErrorLog.Text+lst.Text));
ErrorLog.Sorted := True;
ErrorLog.Sorted := False;
lst.Clear;
For inCounter := (ErrorLog.Count - 1) DownTo 0 Do
Begin
lst.Add(ErrorLog[inCounter]);
End;
TrimErrorLog(lst);
ErrorLog.Clear;
Finally
lst.Free;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
Initialization
ProcName := 'Initialization'; Try
LogErrors := True;
RaiseErrors := False;
ErrorLogSizeLimit := 100000;
SaveToFileEveryNErrors := 1;
ErrorLogFileName := Copy(ParamStr(0),1,Length(ParamStr(0))-4)+'_err.txt';
ErrorLog := TstringList.Create();
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
Finalization
ProcName := 'Finalization'; Try
If LogErrors Then SaveErrorLog;
ErrorLog .Free; ErrorLog := nil;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End.
//