Существует два типа исключений (игнорирование StackOverflowException и т. Д., С которыми вы ничего не можете поделать):
- Те, которые вызваны внешними проблемами (такими как файловый IO), которые должны быть обработаны.
- Те, которых всегда можно избежать при правильно проверенном вводе.
Обычно имеет смысл передавать исключения типа IO в стек вызовов без изменений, поскольку в любом случае вы ничего не можете с этим поделать. Исключениями могут быть ожидаемые ошибки, для которых вы можете повторить попытку или попросить пользователя, что делать, если ваш API работает на уровне графического интерфейса пользователя (что было бы довольно необычно).
Обязательно задокументируйте, какие исключения этого типа могут генерировать ваши методы API.
Для второго типа (исключения, которые всегда можно предотвратить) эти исключения могут генерироваться вашим API при неправильном вводе, но никогда не должны передаваться в стек вызовов с более низких уровней. Входные данные для всего, что вы вызываете, должны быть проверены, чтобы эти ошибки не возникали, и если по какой-то причине они могут возникать, то эти исключения следует свернуть. В противном случае код, использующий ваш API, будет иметь дело с исключениями на неправильном уровне абстракции.
И еще раз, обязательно документируйте, какой тип ввода не будет генерировать исключения, и какие исключения следует ожидать в случае нарушения этих правил.
Во всех случаях создавайте исключения, которые имеют смысл для пользователя вашего API, а не для человека, программирующего сам API.