Vorstellen könnte ich mir, das du die wichtigsten konstruktoren überdeckst und nur einen key (anstatt der message) übergibst und dann die
exception-klasse sich die message holt und an die vorfahren weitergibt:
Delphi-Quellcode:
type
TLokiExceptionClass =
class of TLokiException ;
TLokiException =
class(
Exception)
protected
class function ResolveMsg(
const aKey:
string):
string;
public
constructor Create(
const key:
string);
reintroduce;
constructor CreateFmt(
const key:
string;
const Args:
array of const);
reintroduce;
end;
...
{ TLokiException }
constructor TLokiException.Create(
const key:
string);
begin
inherited Create(ResolveMsg(key));
end;
constructor TLokiException.CreateFmt(
const key:
string;
const Args:
array of const);
begin
inherited CreateFmt(ResolveMsg(key),Args);
end;
class function TLokiException.ResolveMsg(
const aKey:
string):
string;
begin
result := GetMsgFromAnywhere(aKey);
// musst du selbst implementieren
end;
Metaklassen brauchst du dann eigentlich nicht, obwohl man das vielleicht auch nutzen kann. mal sehn, aber erstmal das hier. Ein aufruf könnte dann so aussehen:
Delphi-Quellcode:
...
raise EIrgendWasIstFaul.create('<IWIF>');
damit würdest du vermeiden, dass du explizite texte angeben musst, sondern nur einen key. So du kannst jetzt nutürlich noch vereinfachungen mit metaklassen machen. zB.:
Delphi-Quellcode:
...
// anstatt direkt zu 'raisen' eine procedure beauftragen:
RaiseMyError('
<IWIF>');
...
procdure RaiseMyError(
const aKey:
string);
var EClass:TLokiExceptionClass;
begin
EClass:=TLokiExceptionClass( ? list.indexOfObject(aKey).
Object.wasWeissIch ? );
if ECLass <>
nil then
raise EClass.create(aKey)
else
raise Exception('
Unknown exception :'+aKey);
end;
Macht das sinn? Müsste man vielleicht nochmal überdenken. Letztendlich muss es dir genehm sein
Will dir ja nix aufdrängen.
mâxîmôv.
{KDT}