Прикладные уровни должны определять пользовательские типы исключений, независимо от того, что говорит Microsoft.Предположим, у кого-то есть абстрактный класс WrappedCamera, производные которого служат обертками для таких классов, как CanonCamera, NikonCamera, KodakCamera, и будущие производные которых будут служить обертками для классов, разработанных в будущем.Предположим, что класс WrappedWaldorfCamera оборачивает WaldorfCamera, а когда он вызывает WaldorfCamera.GetPictureCount (), этот метод вызывает исключение WaldorfCamera.WrongCameraModeException.Если WrappedWaldorfCamera разрешает возникновение исключения, что будет с ним делать приложение?Если приложение не предполагает, что все неизвестные типы исключений должны отображать сообщение, но позволяют программе продолжаться, приложение не может знать, что исключение WaldorfCamera.WrongCameraModeException было безопасно перехватить.Напротив, если бы WrappedWaldorfCamera генерировал исключение WrappedCamera.CameraModeException, которое получено из WrappedCamera.CleanNonConnectStateException, приложение знало бы, что оно должно перехватить исключение и обработать его.
Кстати, чтобы никто не жаловался, что вся «проблема»был создан WaldorfCamera, определяющим его собственное исключение, рассмотрите ситуацию, если вместо этого WrappedWaldorfCamera разрешит перенаправлять InvalidOperationException.Что приложение должно делать с одним из них?
Надлежащим образом для каждого уровня приложения определить, как минимум, типы фатальных и нефатальных исключений - как правило, с несколькими вариантами каждого в зависимостипосле состояния приложения (например, CleanNonConnectStateException будет означать, что конкретный объект подключения камеры не имеет допустимого соединения; код приложения, который подготовлен для обработки этого, должен перехватить исключение, в то время как код, который не подготовлен для обработки этого, должен позволитьпузырек исключения до кода, который может обработать ситуацию, перематывая исключение, если оно пересекает границу другого слоя.