Похоже, вам нужен составной валидатор, в котором ваши пользователи могут подключать свою собственную логику, чтобы помечать определенные несмертельные ошибки как фатальные, предупреждающие или информационные сообщения. Создание исключения не соответствует счету, поскольку вы уже покинули метод, если другая часть хотела преобразовать его в предупреждение, но хотела бы продолжить анализ. Это очень похоже на двухпроходную модель обработки исключений в Windows для структурированной обработки исключений.
В основном это выглядит как
- Зарегистрируйте столько обработчиков исключений, сколько пожелаете
- При обнаружении проблемы на проходе все обработчики спрашиваются (пока не выбрасывается исключение!), Какой из них хочет обработать ошибку. Первый, который говорит «да», станет фактическим обработчиком, который решает, что делать.
- Когда был найден обработчик, который может обработать, мы переходим к этапу 2 и вызываем его. На этот раз это время исключения или нет. Это полностью зависит от обработчика.
Прелесть этой двухпроходной модели в том, что во время первого прохода у всех обработчиков спрашивают, но вы все равно можете продолжать синтаксический анализ там, где вы оставили. Ни одно государство еще не было разрушено.
В C # у вас, конечно, гораздо больше свободы, чтобы превратить это в более гибкий конвейер преобразования ошибок и отчетности, где вы можете преобразовать данные для строгого читателя, например, все предупреждения об ошибке.
Какой маршрут вам нужно пройти, зависит от того, как используется ваша библиотека и насколько опытны пользователи вашей библиотеки и сколько запросов на обслуживание вы хотите обработать, потому что некоторые пользователи делают глупые ошибки. Всегда есть компромисс между тем, чтобы быть как можно более строгим (возможно, слишком строгим, и вы получаете трудно использовать библиотеку) или слишком расслабленным (хороший парсер, но молча пропускает половину моего ввода из-за внутренних ошибок).
Библиотеки Windows SDK иногда довольно сложны в использовании, потому что инженеры там оптимизируют больше для меньшего количества обращений за обслуживанием. Они выдают вам код ошибки Win32 или HResult, и вы должны выяснить, какой принцип (выравнивание памяти, размер буфера, кросс-потоки, ...) вы нарушили.