Truthfully I am not sure, if you simply throw, without the custom message, it works fine.
From what I understand, if you are nesting Try/Catch blocks, each inner block needs to generate a more specific error, since you are specifying two errors that are essentially just strings, maybe that is why (not sure). If you use
This way works, I have tested it with a few extra nests, and made it fail at different points, and you can still have custom error messages, or even mix them with system generated ones by adding $_ into the string. However, what you don't get is the line number where it failed.