Should the parse() implementation throw this exception, rather than returning a boolean and creating it here?  The implementation itself will have more context on what actually went wrong.