{$mode objfpc} {$h+} {$modeswitch duplicatelocals}
uses
	SysUtils;

type
	IMyObject = interface
		procedure DoSomething;
	end;

	TMyObject = class(TInterfacedObject, IMyObject)
		name: string;
		constructor Create(const name: string);
		destructor Destroy; override;
		procedure DoSomething;
	end;

	constructor TMyObject.Create(const name: string);
	begin
		inherited Create;
		self.name := name;
		writeln('Объект ', name, ' создан.');
	end;

	destructor TMyObject.Destroy;
	begin
		writeln('Объект ', name, ' уничтожен.');
		inherited Destroy;
	end;

	procedure TMyObject.DoSomething;
	begin
		writeln('Объект ', name, ' работает.');
	end;

	procedure Main;
	var
		o: IMyObject;
	begin
		o := TMyObject.Create('A');
		o.DoSomething;

		o := TMyObject.Create('B');
		o.DoSomething;

		o := TMyObject.Create('C');
		raise Exception.Create('Упс.');
		o.DoSomething;
	end;

begin
	try
		Main;
	except
		on e: Exception do writeln(e.Message);
	end;
end.