>> Is it good style to catch exceptions "far away" from the place there they get thrown?
Yes, sort of. A common error made when using exceptions is to catch the exception too close to where it is thrown.
The best place to catch an exception is wherever the best place to handle it is. In your case, invalid command line arguments should be handled in main (or the equivalent) so that the application can error out and exit.
It would seem a little weird to catch boost::bad_lexical_cast somewhere far from where you do the cast, though.
If you have multiple command line arguments to process, perhaps you can have a block of code that parses all of them and put that into it's own try/catch, but otherwise I think just leaving it where you have it (or around a main2() type function) is best.