It does throw syntax errors, but like other exceptions,
eval catches them. Quite the opposite of what you said, they *are* caught when using
eval and they are *not* caught without it. Feel free to rethrow them using
die.
eval "require My::Object::$subclass; 1"
or die $@;