Naciśnij “Enter” aby skoczyć do treści

Tiny Radio Player #07 – Logowanie błędów

Do logowania błędów i wyjątków napiszemy niewielką klasę TLog. Jej zadaniem będzie odpowiednie sformatowanie i zapisanie informacji o błędzie. Błędy zapiszemy w pliku Application.log, który zostanie utworzony w głównym katalogu aplikacji.

unit Log;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Consts
type

  TLog = class sealed (TObject)
  private
    class procedure SaveToFile(const Message: string);
  public
    class procedure LogException(const Message: string;
      const NameOfTheClass: string = EMPTY_STR;
      const NameOfTheMethod: string = EMPTY_STR;
      const E: Exception = nil); // A static method
  end;

implementation

uses
  Helpers;

class procedure TLog.LogException(const Message: string; const NameOfTheClass: string;
  const NameOfTheMethod: string; const E: Exception);
var
  exceptionMessage: string;
begin
  // Get exception message
  if E <> nil then
    exceptionMessage := E.Message
  else
    exceptionMessage := EMPTY_STR;

  // Save a message
  SaveToFile(
    Format('%s %s.%s:%s error raised, with message: %s',
      [DateTimeToStr(Now), NameOfTheClass, NameOfTheMethod, E.ClassName,
       Message + IIF(exceptionMessage <> EMPTY_STR, #13#10 + exceptionMessage, EMPTY_STR)]
    )
  );
end;

// Saves the message to the disk
class procedure TLog.SaveToFile(const Message: string);
var
  TF: TextFile;
  Path: string;
begin
  // path to the log file
  Path :=  ConcatPaths([GetApplicationPath, LOG_NAME]);

  AssignFile(TF, Path);
  try
    if FileExists(Path) then
      Append(TF)
    else
      Rewrite(TF);

    Writeln(TF, Message);

    Flush(TF);

  finally
    CloseFile(TF);
  end;
end;

Klasa TLog zawiera tylko jedną metodę publiczną LogException. Wymaga ona przekazania kilku parametrów takich jak nazwa klasy, nazwa metody, treści wyjątku oraz dodatkowej informacji opisującej wystąpienie błędu.

W razie wystąpienia błędu, logowanie może wyglądać mniej więcej tak

try
  // kod, który może zakończyć się błędem
except
  on E: Exception do
  begin
    LogException('Adding a new station to the database', ClassName, 'AddNewStation', E);
  end;
end;