Use exception codes in the calculation engine to make it easier to identify and handle errors, instead of relying on text message assessment.
This is: ``` - [ ] a bug report - [X] a feature request ``` Exceptions in the calculation engine simply return a text message identifying the problem, and any related values, e.g. `"undefined name ''NAMED_RANGE"`, where `NAMED_RANGE` is used in a formula, but hasn't actually been defined. We catch this in `getCalculatedValue()` but have to assess the text of the message in order to convert it into a `#NAME?` response. It would be easier if we could use exception codes to make the exception easier to identify and determine an appropriate return value for the different potential exceptions that could be thrown. A simple mapping of exception codes to responses would provide a much easier implementation (and be more efficient) than a long list of if tests, each with its own `strpos()` check. This also allows for differentiating between a function that returns a genuine string value of `#NAME?`, and a genuine `#NAME?` error when evaluating a formula. At present, a string of `#