throw strfmt("Error in %1", funcname());
The right X++ code was then:
throw error(strfmt("Error in %1", funcname()));
While the typical argument for throw is an enumeration of type Exception (), actually the throw instruction accepts any in AX existing type.
After some tests I get the follow insights:
- The Kernel obviously tries to convert the given argument into an integer and then to procced the conversion:
F.ex. this X++ code
throw "3";
raises an exception with the type error. Ditto
throw "3.7";
- More complex types like objects and tables (except a not initialized CLR-Object) raises exception codes above value 255. Tough only exceptions between 0 and 255 can be handled in a different way, an exception above 255 can be catched with a general catch block.
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!") }
Of course you may think this statement gives the ability to use self defined exception codes. I advice against this idea; in further versions of AX, the self defined codes could be used by the Kernel itself and brings unexpected side effects like continue database transactions (in fact, some exception codes include this feature already).