По сути, то, что вы просите, невозможно практически в любой реальной ситуации.
Есть две части документирования сгенерированных исключений.
1) Легкий бит. Документируйте исключения, которые напрямую генерируются в вашем методе. Вы можете сделать это вручную, но это довольно трудоемко, и если вам не удается синхронизировать документы с кодом, документация вводит в заблуждение (потенциально хуже, чем отсутствие документации вообще, поскольку вы можете действительно доверять документации, в которой вы уверены на 100% точный). Моя надстройка AtomineerUtils значительно упрощает эту задачу, поскольку синхронизирует код и комментарии к документу с минимальными усилиями.
2) Немного невозможно. Документируйте все исключения, которые могут «пройти» через ваш метод. Это означает повторение через все поддерево методов, вызываемых вашим методом, чтобы посмотреть, что они могут выдать. Почему невозможно? Что ж, в простейших случаях вы будете статически привязываться к известным методам и, следовательно, можете сканировать их, чтобы увидеть, что они выдают - в меру легко. Но в большинстве случаев в конечном итоге вызываются динамически связанные методы (например, виртуальные методы, отраженные или COM-интерфейсы, методы внешних библиотек в dll, API-интерфейсы операционной системы и т. Д.), Для которых вы не можете окончательно определить, что может быть выброшено (как вы не будете знать, что называется до тех пор, пока вы на самом деле не запустите программу на ПК конечного пользователя - все ПК отличаются друг от друга, и код, выполняемый на (например) WinXP и Win7, может сильно отличаться. Или представьте, что вы вызываете виртуальный метод, а затем кто-то добавляет плагин -в вашей программе, которая переопределяет метод и генерирует исключение нового типа). Единственный способ надежно справиться с этой ситуацией - перехватить все исключения в вашем методе, а затем повторно выдать конкретные, которые затем можно точно задокументировать - если вы не можете сделать это, то документирование исключений в значительной степени ограничено Бросали и обычно ожидали исключения "в вашем методе", оставляя "исключительные ошибки" в основном недокументированными и просто передавались на более высокий уровень блоков обработки необработанных исключений (Именно это ужасное «неопределенное» поведение исключений часто приводит к необходимости использования catch (...) - академически это «зло», но если вы хотите, чтобы ваша программа была пуленепробиваемой, вам иногда приходится использовать catch - быть уверенным, что непредвиденные ситуации не убьют ваше приложение).