throw strfmt("Fehler in %1", funcname());
Der korrekte X++ Code lautete schliesslich:
throw error(strfmt("Fehler in %1", funcname()));
Während typischerweise ein Element der Enumeration vom Typ Exception (also im Prinzip eine Ganzzahl) an throw übergeben wird, akzeptiert diese Anweisung aber in Wirklichkeit jeden in AX vorhandenen Typ.
Nach ein paar Tests lässt sich folgende Aussagen machen:
- Der Kernel versucht offensichtlich das Argument in eine Ganzzahl umzuwandeln und dann zu interpretieren:
Der Code
throw "3";
löst beispielsweise eine Ausnahme vom Typ Error aus. Ebenso
throw "3.7";
- Komplexere Typen wie Objekte und Tabellen (mit Ausnahme von nicht initialisierten CLR-Objekten) lösen einen Ausnahmecode grösser 255 aus. Obwohl nur Ausnahmen zwischen 0 und 255 differenziert behandelt werden können, kann eine Ausnahme mit einem höheren Wert als 255 durch einen allgemeinen Catch-Block trotzdem abgefangen werden.
try { throw 230; } catch (230) { info("This works fine.") } try { throw 256; } catch (256) { // this line will never reached } catch { info("That's the way it is!") }
Nun könnte diese Feststellung natürlich dazu verleiten, selbst definierte Ausnahmecodes einzuführen und zu verwenden. Davon würde ich allerdings abraten; in kommenden Versionen könnten diese durch den Kernel definiert werden und spezielles Verhalten an den Tag legen, wie z.B. das weiterführen von Datenbranktransaktionen, was zur Zeit bei einigen Ausnahmen ja bereits der Fall ist.
No comments:
Post a Comment