Вы сгенерирует исключение, используя ключевое слово throw
:
throw new PatternFormatException(...);
Как правило, вы хотите, чтобы поймать исключения в начале, как они происходят, и обращаться с ними должным образом. Если вы хотите, чтобы ваш синтаксический анализатор (или любая другая программа, которую вы пишете) генерировали значимые ошибки, обычно рекомендуется обернуть любое пойманное исключение и повторно бросить его, внедренное в более значимое исключение, предоставляя пользователю лучшее представление о том, как вещи пошло не так.
Что-то вроде этого:
try {
doSomething(); // throws SomeException
doSomethingElse(); // throws SomeOtherException
}
catch (Exception e) {
throw new PatternFormatException(..., e);
}
вообще хорошо, если вы точно знаете, что исключения могут произойти, и если все они должным образом инкапсулируется PatternFormatException
. Однако ключевая идея Exceptions в Java заключается в том, что вы всегда знаете обо всех возможных исключениях, которые могут произойти. Вот почему Java заставляет вас добавить все возможные исключения (за исключением RuntimeException) в объявление метода.
Более безопасный дизайн будет:
try {
doSomething(); // throws SomeException
doSomethingElse(); // throws SomeOtherException
}
catch (SomeException e) {
throw new PatternFormatException(..., e);
}
catch (SomeOtherException e2) {
throw new PatternFormatException(..., e2);
}
catch (Exception e3) {
throw new UnexpectedPatternFormatException(..., e3);
}
Обратите внимание, что первые два catch
эсов называют различные конструктор, и, таким образом, может обрабатывать различные исключения по-разному. Последнее catch
обертывает непредвиденное исключение, потому что ваша программа столкнулась с исключением (вероятно, RuntimeException
), которого вы не планировали. Если пользователи затем жалуются на UnexpectedPatternFormatException
, вы можете просто вернуться к своему коду и исправить код, чтобы исходное исключение либо больше не было брошено, либо обернуто более значимым образом. Вы также можете просто использовать один класс UnexpectedMySomethingException
в качестве спада для всех блоков try/catch, которые у вас есть, чтобы сделать вещи немного проще.
Следует упомянуть последнее слово о проблемах, вызванных исключениями. Несмотря на то, что Java использует исключения для всех ситуаций, даже те, которые в значительной степени не находятся под контролем Java-программиста (например, при доступе к файлам или даже при попытке анализируем строки как числа), всегда помните, что броски и ловушки Исключения на самом деле довольно дороги, поэтому многие люди избегают этого. Только действительно используйте Исключения, если производительность не является проблемой (когда исключение является редким событием).
Кроме того, Исключения могут угрожать целостности состояния вашей программы, если вы выбрали исключение и слишком поздно задерживаете его, чтобы строки, которые должны были быть выполнены, не выполнялись (например, код для очистки ресурсов или другого кода, который необходимо, чтобы состояние программы было «правильным»), и, как результат, единственная безопасная вещь - закрыть программу.
Да, вы можете. Просто сделай это и посмотри. –