Есть 2 противоположных мнения на этот счёт, и там и там есть свои плюсы и минусы.
На мой взгляд так:
Если пишешь библиотеку/фреймворк - то можно использовать свои исключения. Но вводи новые классы исключений только когда в них есть необходимость. Т.е. не надо создавать исключение, если можно обойтись системным, не надо городить 200 типов ошибок, чтобы потом часами разматывать стек, смотреть кто что вызвал и писать в блоках catch обработку десятков разных типов твоих ошибок. И вообще, в этом случае, лучше передавать исключения наверх.
Если пишешь приложение - то свои исключения лучше не создавай. Ну и лови как можно больше, чтобы прога не падала на каждый чих, оставь только критические, с которыми вообще жить нельзя.