Следует учитывать, что стоимость блока try, в котором не генерируется исключение, отличается от стоимости фактического создания и перехвата исключения.
Если исключения генерируются только в случаях сбоя, вы почти наверняка не заботитесь о производительности, так как вы не будете очень часто отказывать при выполнении вашей программы. Если вы терпите неудачу в узком цикле (a.k.a: стучать головой о кирпичную стену), у вашего приложения, скорее всего, проблемы хуже, чем медленные. Поэтому не беспокойтесь о стоимости создания исключения, если только вы не вынуждены каким-то образом использовать их для регулярного потока управления.
Кто-то опубликовал ответ, говорящий о профилирующем коде, который выдает исключение. Я никогда не проверял это сам, но уверенно предсказываю, что это покажет гораздо больший удар по производительности, чем просто входить и выходить из блока попытки, не бросая ничего.
Еще одна вещь, которую следует учитывать, это то, что, когда вы вкладываете вызовы с большим количеством уровней, даже одна попытка может быть быстрее ... поймать вверху, чем проверять возвращаемые значения и распространять ошибки при каждом вызове .
В противоположность той ситуации, когда вы обнаруживаете, что вы упаковываете каждый вызов в свой собственный блок try ... catch, ваш код будет работать медленнее. И уродливее.