TL; DR
Выбросьте весь блок try / catch и попросите метод самого верхнего уровня сообщить пользователю, что вы не можете выполнить задачу, которую он вам приказал делать.
Концепция
Похоже, вы разделяете (широко распространенное) неправильное представление о том, как действовать в исключительных ситуациях, например: «Исключения - это плохо! поймать их как можно раньше! " Это неверно. Исключения идеально подходят для того, чтобы сообщить вызывающему абоненту о моей неудаче: «Я не смог завершить sh свою работу. Вы решаете, можете ли вы обойтись без него, повторите попытку каким-либо другим способом или просто сообщите об этом своему вызывающему абоненту».
У вашего func()
есть работа (каким бы ни был этот «контракт»). Исключение, выбрасываемое из метода, предназначено для сообщения о том, что этот метод (полностью) не выполнил свою работу.
В вашем случае вызывающий func()
не имеет возможности узнать, что метод не был ничего не может сделать (скорее всего, не выполняет свой контракт). Таким образом, ваш вызывающий абонент будет продолжать с радостью, не зная, что решающий шаг его алгоритма завершился неудачно, что приводит либо к последующим ошибкам, либо, что еще хуже: бессмысленным данным.
* 1018 Исключение доходит до вашего вызывающего абонента, он, таким образом, получает информацию о сбое и может решить, может ли он разумно продолжить работу даже после сбоя
func()
.
В большинстве случаев это решение гласит: «Если что-то в моем алгоритме терпит неудачу, все это терпит неудачу, и я немедленно хочу прервать все его вычисления ". И это то, что вы получаете бесплатно от исключений, если ничего не поймаете.
Ваше предложение catch
Вы пытаетесь представить удобное сообщение с описанием проблемы лучше, чем автоматическая c текстовая форма, которую Java Runtime связывает с исключением.
На первый взгляд это кажется правдоподобным, но ...
Если это func()
является помощником, используемым глубоко внутри вашего кода, конечный пользователь, сидящий перед своей машиной, не найдет вашу формулировку более полезной, чем тексты Java. Только если вы реализуете настольный калькулятор, где пользователь явно хочет разделить два числа, тогда текст ошибки, говорящий о делении на ноль, будет полезным для пользователя. В типичном случае он не может связать это деление на ноль с чем-либо, что он хотел от вашей программы (например, расчетом кредитных процентов).
Ответы на ваши вопросы
- Ваш общий подход имеет некоторые недостатки, как описано выше. Я сомневаюсь, что вы можете создать хорошее, понятное для пользователя сообщение об ошибке только из объекта исключения, независимо от кода, в котором это произошло. А использование instanceof в Java почти всегда плохая идея.
- Да, это неудобно. Вы пишете много строк без ценной выгоды.
- Если вы действительно хотите остаться с текстами, зависящими от типа исключения, используйте несколько предложений catch для разных классов исключений. Не думаю, что это имеет значение для производительности. И ваше программное обеспечение должно работать в очень странной области, если производительность обработки ошибок имеет значение.