C#

Рекламный модуль
Вносител на дамски чанти и аксесоари.

Реализация обработчиков исключений

Обработчик исключения реализуют с помощью ключевых слов try, catch и finally Реализуя обработчик исключений, вы говорите, что если в определенном блоке кода произойдет исключение, то его следует перехватить и обработать таким образом. Обработчик исключения имеет следующий формат: [действие 1} try [действие 2] catch (Exception exception) [действие 3] [действие 4} Формат записи обработчика исключении прост. Ключевое слово try и фигурные скобки ({}) определяют область кода или блок (block), защита которого осуществляется. Защита означает, что любое созданное здесь исключение должно будет пройти через об-работчик. Если исключение передано защищаемым кодом, то выполнение кода в блоке :a~ch позволит вам обработать исключение. Ключевое слово catch расположено непо-: гедственно после блока try. Блок catch определяет, какое исключение будет перехваче-но. и устанавливает шаги, которые следует предпринять в случае такого исключения. Если код внутри блока try (действие 2 в примере) вызывает другой метод, то код внутри вызываемого метода тоже защищен. Дело обстоит так, что даже если код не за-^згщен с точки зрения данного метода, то происходит перехват исключения при нали¬чии нескольких методов (рис. 5.4). рис. 5.4 защищенный код действие 2 вызывает метод, имеющий действие 2.1, :т-?::зие 2. 2 и действие 2.4. Действие 2.2 выполняется в контексте блока исключе- -::~: если действие 2. 2 передает исключение, то оно будет перехвачено и обработано жяствием 2.3. Блок catch, содержащий действие 3, ничего не знает об исключении. . точки зрения вызываемого метода, действие 2.1 и действие 2. 4 не защищены, : поскольку вызываемый метод вызывается из действия 2, которое защищено бло- : :acch, содержащим действие 3, действие 2.1 и действие 2. 4 считаются защи- - -иными. Если действие 2.1 или действие 2. 4 передаст исключение, то блок catch ze-йствием З перехватит его. Этот пример иллюстрирует два момента. • Исключения могут перехватывать вызовы методов. • Когда исключение передано, его перехватит обработчик, ближайший к месту его передачи. Изкключение может быть перехвачено и обработано одним из обработчиков исклю- ш, даже при том, что это исключение нельзя перехватить более высокоуровневым ' с ^ботчиком исключений. Эта ситуация проиллюстрирована на рис. 5.3, где исключение было передано и перехвачено IDE. Исключение, которое было передано методами на несколько вызовов вглубь, может быть перехвачено на самом высоком уровне. В предыдущих примерах исключение было передано потому, что код делал что-нибудь, что не предполагалось делать. Но вы можете передать исключение нарочно, используя следующий синтаксис. throw new Exception(); При передаче исключения, подобного этому, вы создадите экземпляр типа, связан¬ного с базовым классом Exception. Ключевое слово throw совместно с созданием объ¬екта исключения передает исключение, которое можно перехватить высокоуровневым блоком catch. В большинстве случаев передачи исключения вы будете создавать экземпляр того типа исключения, которое предстоит передать. В предыдущем примере использовался конструктор Exception () без параметров, но в других вариантах можно использовать следующий код: try { throw new Exception("Exception in action 2.4."); } catch (Exception thrown) { throw new Exception("Exception in action 2 has been caught.", thrown); } Первый вариант, Exception ("Exception in action 2 . 4 ."), использует параметр конструктора со строковым описанием того, что пошло не так, как надо. Этот текст предназначен для отображения пользователям вместо стандартного объяснения типа "Error 168: Incorrect parameter". Второй вариант, Exception ("Exception in action. 2 has been caught. ", thrown), включает исходное исключение как дополнительный параметр конструктора в передаваемом исключении. Это позволяет вам передать еще более подробную информацию. Вывод, созданный этим кодом, выглядит следующим образом: Unhandled Exception: System.Exception: Exception in action 2 has been caught. > System.Exception: Exception in action 2.4. Созданное исключение явно указывает вам, где оно произошло и где оно было об-работано. Вы получили полное руководство к действию. Давайте рассмотрим следующую редакцию кода, с уменьшенным объемом информации. try { throw new Exception("Exception in action 2.4."); } catch (Exception thrown) { throw new Exception("Exception in action 2 has been caught"); } Результат не самый вразумительный. Unhandled Exception: System.Exception: Exception in action 2 has been caught. Если вы хотите получать доступ к ошибочной строке, то можно использовать свой¬ство исключения Message. try { throw new Exception("Exception in action 2.4."); } catch (Exception thrown) Console.WriteLine(thrown.Message); throw new Exception("Exception in action 2 has been caught."); } Вы уже имеете более определенное сообщение, но не как часть потока исключений: Exception in action 2.4. Unhandled Exception: System.Exception: Exception in action 2 has been caught. He повторяйте сообщений об ошибках Когда вы передаете исключения, удостоверьтесь, что не используете то же самое сообщение об ошибке дважды. Вообразите ситуацию, вы передаете программу в эксплуатацию и появляется сообщение об ошибке "Файл не найден". Если этот текст используется в несколькими местах, то при обращении пользователя в службу технической поддержки ее персонал не сможет понять, какой именно файл не найден. Вместо этого, в сообщении об ошибке следует указать, какой именно файл не был найден и почему. Чем больше деталей вы укажете, тем проще будет персо¬налу службы поддержки помочь пользователям найти решение проблемы.