guard

Im Anweisungsblock entspricht es folgenden Makros

// Ist die als Argument übergebene Anweisung erfolgreich, läuft das Programm weiter.
// Ansonsten wird die Funktion abgebrochen und der Fehler als Funktionsergebnis zurückgegeben.
#define IFCASSERT( CMD ) { Ifc::Error __temperror__ = CMD; if( !__temperror__ ) return __temperror__; }
 
// Ist die als Argument übergebene Anweisung erfolgreich, läuft das Programm weiter.
// Ist übergebene Anweisung nicht erfolgreich, wird der übergebene Fehler zurückgegeben
#define IFCASSERT( CMD, ERR ) { if( CMD ) return ERR; }

Die Anwendung:

IFCASSERT( ObjectPlacement->ToTransformation3d( trafo ) );

entpsricht

guard ObjectPlacement->ToTransformation3d( trafo );

meldet ToTransformation3d einen Fehler, wird die Funktion mit diesem Fehler verlassen.

mit dem @> Operator lassen sich neue Fehler erzeugen:

// Ist die als Argument übergebene Anweisung erfolgreich, wird die Funktion mit OK beendet
// Ist übergebene Anweisung nicht erfolgreich, wird der übergebene Fehler zurückgegeben

#define IFCRETURN( CMD, ERR ) { if( CMD ) return ERR; else return Ifc::Error( true ); }
guard ObjectPlacement->ToTransformation3d( trafo ) @> TransformationFailed( "Description" );

@> Verweist auf einen neuen Fehler, der an dieser Stelle deklariert wird. Die Funktion ist danach also in der Lage einen „TransformationFailed“ Fehler zu werfen.

Es sollte die Möglichkeit geben, ähnlich einer Switch-Anweisung Fehler umzubenennen.

Die Fehler werden innerhalb der Funktion statisch konstruiert. Die Description wird durch rcptr übergeben.

guards können auch ganze Blöcke übernehmen.

guard
{
  Transformation3d trafo;
  
  ObjectPlacement->ToTransformation3d( trafo ) @> TransformationFailed( "Description" ); @> TransformationError.
}

Ein Error kann - je nach kompilierweise - eine id (die dem String auf den Fehler entspricht) und eine Beschreibung besitzen. Optional sind der Name auf die Funktion und Datei und Zeilennummer und eien Liste von Fehlern, wenn dieser durch Guards weitergereicht wurde.

Ein Error kann mit dem datentyp error zwischengespeichert werden, besitzt den Index-Operator und eine io-Schnittstelle, um ihn auszulesen.