One could certainly do this, but I believe it would turn out to be
a bad idea in practice. Every typo of an identifier would still
make a valid program, just not the one you thought it was.

You ask about exceptions, which are runtime constructs, but
you example here is about compile time constructs. Syntax
errors aren't exceptions in the usual sense; they indicate
that a stream of characters is not a program.

Consider that at the endpoint, it would be possible to
design a language such that every stream of characters
was a valid program; this would *not* be a desirable
property. (But I do agree that reducing exceptions is
a desirable goal.)