Error Handling
When you write code, you might want the error to throw something.
Formally learned this in CS247.
There are several ways to handle errors.
Option 1: Sentinel values
Reserve some values, -1, INT_MIN to signal errors
Problem: reduces what we can return, can’t return -1 in a regular scenario. Not clear for a general type T what values we should pick as sentinels.
Option 2: Global Variables
Create some global variable that is set when an error occurs (in C, int errno, which can be queried for errors with standard functions).
Problem: limited # of errors, might be overwritten
Option 3: Bundle in a struct
We can do something like this
template<typename T> struct ReturnType {
int errorcode;
T* data;
}Best so far, but still not ideal. Wrap our return types in this struct, all return types are larger than needed. Awkward to access data field.
These are all approaches that C users end up using. C++ however has a language feature for dealing with errors: Exception.
Learning from Hemal Shah
Within NVIDIA, we actually bundle inside a struct.
If you look at something like TinyXML, they use an Enum.
enum XMLError {
XML_SUCCESS = 0,
XML_NO_ATTRIBUTE,
XML_WRONG_ATTRIBUTE_TYPE,
XML_ERROR_FILE_NOT_FOUND,
XML_ERROR_FILE_COULD_NOT_BE_OPENED,
XML_ERROR_FILE_READ_ERROR,
XML_ERROR_PARSING_ELEMENT,
XML_ERROR_PARSING_ATTRIBUTE,
XML_ERROR_PARSING_TEXT,
XML_ERROR_PARSING_CDATA,
XML_ERROR_PARSING_COMMENT,
XML_ERROR_PARSING_DECLARATION,
XML_ERROR_PARSING_UNKNOWN,
XML_ERROR_EMPTY_DOCUMENT,
XML_ERROR_MISMATCHED_ELEMENT,
XML_ERROR_PARSING,
XML_CAN_NOT_CONVERT_TEXT,
XML_NO_TEXT_NODE,
XML_ELEMENT_DEPTH_EXCEEDED,
XML_ERROR_COUNT
};