in reply to Runtime syntax checking of a 'require'ed module

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 $@;