Программа catch что это

Обработка исключений в C++

Язык С представляет программисту очень ограниченные возможности обработки исключений, возникших при работе программы. В этом отношении С++ намного развитее С. Здесь у программиста существенно большие возможности по непосредственной обработке исключений. Комитет по разработке стандартов С++ предоставил очень простую, но мощную форму обработки исключений.

Темные дни С

Типичная функция, написанная на С, выглядит примерно так:

long DoSomething() < long *a, c; FILE *b; a = malloc(sizeof(long) * 10); if (a == NULL) return 1; b = fopen(«something.bah», «rb»); if (b == NULL) < free(a); return 2; >fread(a, sizeof(long), 10, b); if (a[0] != 0x10) < free(a); fclose(b); return 3; >fclose(b); c = a[1]; free(a); return c; >

Выглядит не очень, не так ли? Вы целиком и полностью зависите от значений, которые возвращают вам функции и для каждой ошибки вам постоянно нужен код, который ее обрабатывает. Если вы, скажем, в функции работаете хотя бы с 10 указателями (рапределяете память, освобождаете ее и т.д.), то наверняка половину кода функции будет занимать код обработки ошибок. Такая же ситуация будет в коде, вызывающем эту функцию, так как здесь также нужно обработать все возвращаемые коды ошибок.

ЧТО ТАКОЕ CAPTURE ONE | Профессиональная обработка фото за 10 минут

Try-catch-throw

Давайте же разберем основы обработки исключений в С++. Чтобы комфортно работать с исключениями в С++ вам нужно знать лишь три ключевых слова:

  • try (пытаться) — начало блока исключений;
  • catch (поймать) — начало блока, «ловящего» исключение;
  • throw (бросить) — ключевое слово, «создающее» («возбуждающее») исключение.

А теперь пример, демонстрирующий, как применить то, что вы узнали:

void func() < try < throw 1; >catch(int a) < cout cout

Если выполнить этот фрагмент кода, то мы получим следующий результат:

Caught exception number: 1

Теперь закоментируйте строку throw 1; и функция выдаст такой результат:

No exception detected!

Как видите все очень просто, но если это применить с умом, такой подход покажется вам очень мощным средством обработки ошибок. Catch может «ловить» любой тип данных, так же как и throw может «кинуть» данные любого типа. Т.е. throw AnyClass(); будет правильно работать, так же как и catch (AnyClass >;.

Как уже было сказано, catch может «ловить» данные любого типа, но вовсе не обязательно при это указывать переменную. Т.е. прекрасно будет работать что-нибудь типа этого:

catch(dumbclass)
catch(dumbclassпоймать» и все исключения:

catch(. )

Троеточие в этом случае показывает, что будут пойманы все исключения. При таком подходе нельзя указать имя переменной. В случае, если «кидаются» данные нестандартного типа (экземпляры определенных вами классов, структур и т.д.), лучше «ловить» их по ссылке, иначе вся «кидаемая» переменная будет скопирована в стек вместо того, чтобы просто передать указатель на нее. Если кидаются данные нескольких типов и вы хотите поймать конкретную переменную (вернее, переменную конкретного типа), то можно использовать несколько блоков catch, ловящих «свой» тип данных:

С++ try catch. Обработка исключений С++. try catch что это. Изучение С++ для начинающих. Урок #120


try < throw 1; // throw ‘a’; >catch (long b) < cout catch (char b) < cout »

Создание» исключений

Когда возбуждается исключительная ситуация, программа просматривает стек функций до тех пор, пока не находит соответствующий catch. Если оператор catch не найден, STL будет обрабатывать исключение в стандартном обработчике, который делает все менее изящно, чем могли бы сделать вы, показывая какие-то непонятные (для конечного пользователя) сообщения и обычно аварийно завершая программу.

Однако более важным моментом является то, что пока просматривается стек функций, вызываются деструкторы всех локальных классов, так что вам не нужно забодиться об освобождении памяти и т.п.

Перегрузка глобальных операторов new/delete

А сейчас хотелось бы отправить вас к статье «Как обнаружить утечку памяти». В ней рассказывается, как обнаружить неправильное управление распределением памяти в вашей программе. Вы можете спросить, при чем тут перегрузка операторов? Если перегрузить стандартные new и delete, то открываются широкие возможности по отслеживанию ошибок (причем ошибок часто критических) с помощью исключений. Например:

char *a; try < a = new char[10]; >catch (. ) < // a не создан — обработать ошибку распределения памяти, // выйти из программы и т.п. >// a успешно создан, продолжаем выполнение

Это, на первый взгляд, кажется длиннее, чем стандартная проверка в С «а равен NULL?», однако если в программе выделяется десяток динамических переменных, то такой метод оправдывает себя.

Операторы throw без параметров

Итак, мы увидели, как новый метод обработки ошибок удобен и прост. Блок try-catch может содержать вложенные блоки try-catch и если не будет определено соответствующего оператора catch на текущем уровен вложения, исключение будет поймано на более высоком уровне. Единственная вещь, о которой вы должны помнить, — это то, что операторы, следующие за throw, никогда не выполнятся.

try < throw; // ни один оператор, следующий далее (до закрывающей скобки) // выполнен не будет >catch(. )

Такой метод может применяться в случаях, когда не нужно передавать никаких данных в блок catch.

Приложение

Приведем пример, как все вышеизложенное может быть использовано в конкретном приложении. Преположим, у вас в программе есть класс cMain и экземпляр этого класса Main: class cMain < public: bool Setup(); bool Loop(); // Основной цикл программы void Close(); >; cMain Main;

А в функции main() или WinMain() вы можете использовать этот класс как-нибудь так:

try < Main.Setup(); Main.Loop(); Main.Close(); >catch (Exception // использование класса, ведущего лог. log(«Exception thrown: %s», e.String()); // Показываем сообщение об ошибке и закрываем приложение. >

Основной цикл программы может выглядеть примерно так:

while (AppActive) < try < // какие-то действия >catch (Exception /* Если исключение критическое, типа ошибки памяти, посылаем исключение дальше, в main(), оператором throw e; или просто throw. Если исключение некритично, обрабатываем его и возвращаемся в основной цикл. */ >>

Заключение

Метод обработки исключений, приведенный в статье, является удобным и мощным средством, однако только вам решать, использовать его или нет. Одно можно скачать точно — приведенный метод облегчит вам жизнь. Если хотите узнать об исключениях чуть больше, посмотрите публикацию Deep C++ на сервере MSDN.

Читайте также:
7launcher что это за программа и нужна ли она

Источник: codenet.ru

Передача файлов по локальной сети между устройствами Windows, Apple и Android с помощью Daemon Tools Catch!

Как передавать файлы на ПК, ноутбуки, планшеты и смартфоны, находящиеся в одной локальной сети? Если бы, например, речь шла только об Android -гаджетах, можно было бы установить специальное приложение с поддержкой передачи данных по локальной сети, например, файловый менеджер ES Explorer. А вот чтобы сделать возможным обмен данными между техникой на базе разных операционных систем — Android , iOS , Windows и Mac .

В двух последних необходимо внести корректные системные настройки для организации папок с общим доступом. Если это по каким-то причинам не получается, либо же неохота возиться с этим делом, можно прибегнуть к альтернативному и достаточно простому решению – к функции Catch! от создателей известной программы для работы с образами Daemon Tools .

Как с её помощью обмениваться файлами в локальной сети?

1. Что такое Daemon Tools Catch!

Catch! – это новая функция, реализуемая в Windows программой Daemon Tools, начиная с версии 10.7 , а в Mac – программой Daemon Tools for Mac, начиная с версии 6.2 . И существующая в виде отдельного приложения для iOS и Android . Она позволяет обмениваться файлами между устройствами на базе этих операционных систем, которые подключены к одной локальной сети. Будь это общественная сеть Wi-Fi , либо же сеть с проводными и беспроводными подключениями, обеспечиваемая, например, домашним роутером.

DAEMON Tools Lite

Приложения «Daemon Catch!» для iOS и просто «Catch!» для Android , реализующие эту функцию, бесплатны. Бесплатно её можно использовать и в среде Windows: функция доступна в рамках свободной редакции программы Daemon Tools Lite. А вот для Мас бесплатной редакции Daemon Tools не существует. Есть только платная, стоит €9,99 , предусматривает трёхдневный триал-срок.

Рассмотрим подробнее принцип работы Catch! в разных системах.

2. Windows

Чтобы бесплатно использовать эту функцию в среде Windows, при установке Daemon Tools Lite выбираем «Free Licence».

Free Licence

Если программа автоматически не выберет русский язык, можем сами установить его в настройках.

Настройки

Язык

Catch! в программе активна по умолчанию, её не нужно активировать и настраивать. Функция автоматически определяет IP -адрес компьютера и порт сети. Разве что можем подкорректировать под себя уже отдельные тонкости. Идём в её настройки.

Catch! - Настройки

Здесь можно, в частности:

• Включать/отключать саму функцию;
• Менять имя компьютера, как он будет видеться в сети в рамках использования Catch!;
• Менять путь сохранения получаемых файлов;
• Включать/отключать интеграцию функции в проводнике Windows.

Catch! - Общие настройки

Все находящиеся в локальной сети устройства с включённым ПО для работы Catch! будем видеть на панели внизу окна программы. Вызвав на значке нужного компьютера или гаджета контекстное меню, сможем перебросить на него данные опциями «Бросить файл» и «Бросить файлы из папки».

Бросить файлы из папки

Компьютер-получатель на базе Windows в системном уведомлении запросит разрешение на принятие файлов. Если это разовая передача данных, даём, соответственно, разовое разрешение — жмём в уведомлении «Разрешить единожды». Если файлы принимаем со своего или доверенного компьютера, тогда даём постоянное разрешение – жмём «Разрешать всегда».

Даём разрешение

Когда данные будут получены, можем открыть папку их хранения «Catch!» прямо в системном уведомлении.

Показать в папке

Эта папка отдельным пунктом отображается в проводнике Windows.

Папка - Catch!

Полученные файлы будут аккуратно рассортированы по подпапкам с названиями устройств-отправителей. А чтобы сразу оказаться в нужной подпапке, просто делаем двойной клик по значку устройства-отправителя на панели внизу окна Daemon Tools.

Catch! интегрируется в проводник Windows, так что данные на другие компьютеры и гаджеты можем отправлять с помощью его контекстного меню.

Контекстное меню

В контекстном меню также есть опция «Обновить». Её можно использовать, когда другой компьютер или гаджет не обнаружились автоматически. Если и после этого они не стали видны, в окне Daemon Tools на панели внизу вызываем контекстное меню, кликаем «Найти и добавить устройство из сети».

Найти и добавить устройство из сети

Пробуем ещё раз обновить, чтобы устройство отобразилось автоматически. Если ничего не происходит, вводим вручную его IP -адрес.

Вводим вручную IP-адрес

3. Mac OS

В Mac OS принцип работы Catch! схож тем, что у Windows, только нет интеграции с Finder . Устанавливаем Daemon Tools. На панели внизу окна программы видим обнаруженные в локальной сети устройства. Выбираем нужное, вызываем на нём контекстное меню, кликаем «Кинуть файлы».

Кинуть файлы

И, указываем, собственно, сами файлы в окне Finder.

Для приёма данных в системном уведомлении кликаем «Разрешить». Если это разовое получение данных с временно оказавшихся в сети компьютеров или гаджетов, предварительно снимаем галочку «Сохранить». Таким образом в дальнейшем для них разрешение будет запрашиваться вновь.

Разрешить

По итогу получения файлов можем открыть их папку хранения в системном уведомлении.

Показать

Либо просто открываем в Finder папку «Документы» , далее — подпапку «Catch!» , затем — подпапку с именем устройства.

Подпапка Catch!

Отключается/включается функция в настройках Daemon Tools. В настройках также можно сменить имя компьютера, как он будет отображаться в рамках использования Catch!. И задать иной путь сохранения полученных файлов по умолчанию.

В настройках

Если нужный компьютер или гаджет не определяется, как и в Windows, в окне Daemon Tools вызываем на нижней панели контекстное меню и выбираем «Найти и добавить устройство из сети».

Найти и добавить устройство из сети

Пытаемся обновить информацию о подключениях. Если результата нет, вводим IP -адрес нужного компьютера или гаджета вручную.

Найденные устройства

Удаляются ненужные компьютеры и гаджеты из числа доверенных для работы с функцией в их контекстном меню на панели внизу окна Daemon Tools опцией «Забыть устройство». И в Windows, и в Мас. Для повторного добавления такого «забытого» компьютера или гаджета необходимо проделать описанные выше операции для поиска и добавления неотображаемого устройства.

4. Android

Приложение для Android «Catch!» являет собой заточенный под работу функции файловый менеджер с отдельными разделами для отображения картинок и аудиофайлов. Для передачи нужных данных на другое устройство в локальной сети выбираем их и жмём значок отправки.

Android Catch!

Указываем принимающий компьютер или гаджет. Вот, собственно, и всё. Если нужное устройство не отображается, жмём кнопку-плюсик.

Найти устройства

И вводим его IP -адрес.

IP-адрес

Приём файлов с другой техники подтверждаем в системном уведомлении Android.

Подтверждаем

Полученные данные, если это изображения или аудиоконтент, отобразятся в разделах приложения, соответственно, «Галерея» и «Музыка». Остальные типы данных ищем в разделе «Файлы», в папке «Пойманные файлы».

Пойманные файлы

Приложение «Daemon «Catch!» для iOS отличается дизайном, но принцип работы самой функции такой же, как и в приложении для Android.

Источник: www.white-windows.ru

Программа catch что это

Catch!
версия: 3.3.710

Последнее обновление программы в шапке: 06.09.2021

Читайте также:
Сетевые дополнительные общеобразовательные программы что это

Прикрепленное изображение

Прикрепленное изображение

Прикрепленное изображение

Прикрепленное изображение


Краткое описание:
Обменивайтесь файлами между устройствами
Описание:

Уважаемое сообщество 4PDA!

Просим вас принять участие в бета-тестировании нового приложения для обмена файлами между устройствами: Catch!

Ссылка на Google Play позволяет зарегистрироваться и установить себе тестовую версию.

Искренне надеемся на ваши комментарии и критику!

✸ Обменивайтесь файлами между устройствами ✸

Везде. Всегда. Все что вам нужно — только Wi-Fi!
Просто выберите несколько изображений из Галереи, файлов или папок из файловой системы и отправьте в одно касание!

Добавьте устройства в списко доверенных, и впредь все данные с них будут получаться автоматически.

✸ Храните все по местам ✸

Книги к книгам, музыка к музыке!
Вы можете назначить неограниченное число папок, чтобы сохранять файлы согласно их расширениям. Теперь все данные будут упорядочены, сохранены и всегда актуальны!

Требуется Android: 4.1+
Русский интерфейс: Да

Прошлые версии
Причина редактирования: Обновление: новая версия 3.3.710 Catch (antisplit)
16.08.16, 09:48 | #2


Друзья 4PDA
Реп: ( -1 )

А пояснее описать?
Если только через WiFi — значит, файлы не гонятся через инет? Регистрация — она зачем (маркетинг-оно понятно)? На устройстве просто открываются некие дополнительные порты и некий демон раз в N времени проверяет не шлёт ли кто ему файл?

16.08.16, 10:55 | #3


Активные пользователи
Реп: ( 4 )

А пояснее описать?
Если только через WiFi — значит, файлы не гонятся через инет? Регистрация — она зачем (маркетинг-оно понятно)? На устройстве просто открываются некие дополнительные порты и некий демон раз в N времени проверяет не шлёт ли кто ему файл?

Добрый день!
Что конкретно вам необходимо прояснить?
Да, сейчас передача происходит через WiFi — либо при условии нахождения устройств в одной публичной или домашней сети с маршрутизатором, либо созданной одним из устройств (hotspot).
Да, отсутствие регистрации в данной версии можно считать маркетинговым ходом. В следющих версиях это станет полноценным преимуществом из-за расширения функционала.
Говоря простым языком — вы правы. Просто демон, просто ждет что ему кто-то отправит файл.

Цель этой публикации — выяснить мнение сообщества по поводу этого приложения, Ваше мнение.

Пожалуйста, если вы считаете наше приложение нужным, удобным, полезным, или наоборот — попробуйте его на практие и выскажитесь об этом.
Заранее спасибо!

16.08.16, 13:28 | #4


Друзья 4PDA
Реп: ( -1 )

Спасибо.
Пока не пробовал, так что «Пастернака не читал, но осуждаю» (с).
Про безопасность Вы, думаю, и сами в курсе.
Много ли демон жрёт? Можно ли сделать его отключаемым (удобно)?

А в принципе даже не знаю нужная ли штука. Вряд ли программа станет так уж широко использоваться, так что скорее для узкого круга — напримеР, в пределах семьи и знакомых-приятелей.

Развивать именно интернет-функционал и облачные функции не вижу смысла, таких решений, мягко говоря, немало.

16.08.16, 14:01 | #5


Активные пользователи
Реп: ( 4 )

Спасибо.
Пока не пробовал, так что «Пастернака не читал, но осуждаю» (с).
Про безопасность Вы, думаю, и сами в курсе.
Много ли демон жрёт? Можно ли сделать его отключаемым (удобно)?

А в принципе даже не знаю нужная ли штука. Вряд ли программа станет так уж широко использоваться, так что скорее для узкого круга — напримеР, в пределах семьи и знакомых-приятелей.

Развивать именно интернет-функционал и облачные функции не вижу смысла, таких решений, мягко говоря, немало.

По поводу безопасности сейчас ведутся обсуждения внутри команды. В свете того, что как вы сами заметили, таких решений уйма, есть мнение выделиться как раз шифрованием и т. п.
А пока есть вот такая простая бетка.

Демон жрет немного. на Nexus 6 разницы с запущенным демоном или нет по расходу батареи не замечено. В принципе ничего не мешает его сделать отключаемым.

Спасибо вам большое за отзыв!

Источник: 4pda.to

20.2 – Основы обработки исключений

В предыдущем уроке о необходимости исключений мы говорили о том, как использование кодов возврата приводит к смешиванию порядка выполнения программы и порядка обработки ошибок, ограничивая и то и другое. Исключения в C++ реализуются с использованием трех ключевых слов, работающих вместе: throw , try и catch .

Выбрасывание исключений

В реальной жизни, чтобы отметить, что произошли определенные события, мы постоянно используем сигналы. Например, во время американского футбола, если игрок совершил фол, судья бросает флаг на землю и дает свисток об остановке игры. Затем назначается и исполняется наказание. Как только наказание снято, игра, как правило, возобновляется в обычном режиме.

В C++ для сигнализации о том, что произошло исключение или ошибка (пример с выбрасыванием флага штрафа) используется инструкция throw . Сигнализация о возникновении исключения также обычно называется генерацией или выбрасыванием исключения.

Чтобы использовать инструкцию throw , просто используйте ключевое слово throw , за которым следует значение любого типа данных, который вы хотите использовать, чтобы сигнализировать о возникновении ошибки. Обычно это значение будет кодом ошибки, описанием проблемы или пользовательским классом исключения.

Вот несколько примеров:

// выбрасываем литеральное целочисленное значение throw -1; // выбрасываем значение перечисления throw ENUM_INVALID_INDEX; // выбрасываем литеральную строку в стиле C (const char*) throw «Can not take square root of negative number»; // выбрасываем переменную double, определенную ранее throw dX; // выбрасываем объект класса MyException throw MyException(«Fatal Error»);

Каждая из этих инструкций действует как сигнал о том, что возникла какая-то проблема, которую необходимо обработать.

Поиск исключений

Создание исключений – это только одна часть процесса обработки исключений. Вернемся к нашей аналогии с американским футболом: что происходит после того, как судья выбросил штрафной флажок? Игроки замечают штраф и останавливают игру. Нарушается нормальный ход футбольного матча.

В C++ мы используем ключевое слово try для определения блока инструкций (называемого блоком try ). Блок try действует как наблюдатель, ищущий любые исключения, которые вызываются любой из инструкций в блоке try .

Вот пример блока try :

Обратите внимание, что блок try не определяет, КАК мы будем обрабатывать исключение. Он просто сообщает программе: «Эй, если какая-либо из инструкций внутри этого блока try вызовет исключение, захвати его!».

Обработка исключений

Наконец, конец нашей аналогии с американским футболом: после объявления штрафа и остановки игры судья определяет наказание и исполняет его. Другими словами, наказание должно быть выполнено до возобновления нормальной игры.

Фактически обработка исключений – это работа блока (ов) catch . Ключевое слово catch используется для определения блока кода (называемого блоком catch ), который обрабатывает исключения для одного типа данных.

Вот пример блока catch , который перехватывает исключения со значениями int :

catch (int x) < // Здесь обрабатываем исключение типа int std::cerr

Блоки try и блоки catch работают вместе – блок try обнаруживает любые исключения, которые вызываются инструкциями в блоке try , и направляет их для обработки в соответствующий блок catch . Блок try должен иметь сразу после себя, по крайней мере, один блок catch , но он также может иметь несколько блоков catch , идущих последовательно.

Читайте также:
Основная общеобразовательная программа дошкольного образования что это

Как только исключение было перехвачено блоком try и направлено в блок catch для обработки, исключение считается обработанным, и выполнение возобновится в обычном режиме после блока catch .

Параметры catch работают так же, как параметры функции, причем параметр доступен в последующем блоке catch . Исключения базовых типов можно перехватывать по значению, но исключения небазовых типов следует перехватывать по константной ссылке, чтобы избежать ненужного копирования.

Как и в случае с функциями, если параметр не будет использоваться в блоке catch , имя переменной можно не указывать:

// обратите внимание: нет имени переменной, // так как мы не используем ее в блоке catch ниже catch (double) < // Здесь обрабатываем исключение типа double std::cerr

Это может помочь предотвратить предупреждения компилятора о неиспользуемых переменных.

throw , try и catch – собираем всё вместе

Вот полная программа, в которой используются инструкции throw , блок try и несколько блоков catch :

#include #include int main() < try < // Инструкции, которые могут вызывать исключения, // которые вы хотите обработать, помещаются сюда throw -1; // простой пример >catch (int x) < // Любые исключения типа int, возникшие в блоке try выше, отправляются сюда std::cerr // без имени переменной, так как мы не используем само исключение в блоке catch ниже catch (double) < // Любые исключения типа double, выданные в блоке try выше, отправляются сюда std::cerr catch (const std::string // Любые исключения типа std::string, возникшие в блоке try выше, отправляются сюда std::cerr std::cout

Выполнение показанного выше блока try / catch приведет к следующему результату:

We caught an int exception with value -1 Continuing on our merry way

Инструкция throw использовалась для вызова исключения со значением -1, которое имеет тип int . Затем эта инструкция throw была перехвачена включающим ее блоком try и направлена в соответствующий блок catch , который обрабатывает исключения типа int . Этот блок catch напечатал соответствующее сообщение об ошибке.

Как только исключение было обработано, программа продолжила работу в обычном режиме после блоков catch , напечатав » Continuing on our merry way «.

Обзор обработки исключений

Обработка исключений на самом деле довольно проста, и следующие два абзаца охватывают большую часть того, что вам нужно помнить о ней.

Когда выбрасывается исключение (с помощью throw ), выполнение программы сразу же переходит к ближайшему, включающему эту инструкцию throw , блоку try (при необходимости с распространением вверх по стеку, чтобы найти охватывающий блок try – мы обсудим это более подробно в следующем уроке). Если какой-либо из обработчиков catch , прикрепленных к этому блоку try , обрабатывает этот тип исключения, то этот обработчик выполняется, и исключение считается обработанным.

Если подходящих обработчиков catch нет, выполнение программы переходит к следующему охватывающему блоку try . Если до конца программы не удается найти подходящего обработчика catch , то программа завершится с ошибкой исключения.

Обратите внимание, что при сопоставлении исключений с блоками catch компилятор не будет выполнять неявные преобразования или расширяющие преобразования (продвижения)! Например, исключение char не будет соответствовать блоку catch int . Исключение типа int не соответствует блоку catch float . Однако приведение производного класса к одному из его родительских классов будет выполнено.

Вот и всё, что нужно помнить. Остальная часть этой главы будет посвящена демонстрации работы этих принципов.

Исключения обрабатываются немедленно

Вот небольшая программа, демонстрирующая, как исключения обрабатываются немедленно:

#include int main() < try < throw 4.5; // генерируем исключение типа double std::cout catch(double x) // обрабатываем исключение типа double < std::cerr return 0; >

Эта программа проста настолько, насколько это возможно. Вот что происходит: инструкция throw , первая выполняемая инструкция, вызывает исключение типа double . Выполнение немедленно переходит к ближайшему охватывающему ее блоку try , который является единственным блоком try в этой программе. Затем на совпадение проверяются обработчики catch . Наше исключение относится к типу double , поэтому мы ищем обработчик catch типа double . У нас есть один такой, поэтому он и выполняется.

Следовательно, результат этой программы будет следующим:

We caught a double of value: 4.5

Обратите внимание, что » This never prints » никогда не печатается, потому что исключение привело к немедленному переходу порядка выполнения к обработчику исключения для значений double .

Более реалистичный пример

Давайте посмотрим на пример, который не совсем академичен:

#include // для функции sqrt() #include int main() < std::cout ; std::cin >> x; try // Ищем исключения, которые происходят в блоке try, < // и направляем к прикрепленным блокам catch // Если пользователь ввел отрицательное число, это условие ошибки if (x < 0.0) < // генерируем исключение типа const char* throw «Can not take sqrt of negative number»; >// В противном случае выводим ответ std::cout catch (const char* exception) // ловим исключения типа const char* < std::cerr >

В этом коде пользователя просят ввести число. Если он вводит положительное число, оператор if не выполняется, исключение не генерируется и печатается квадратный корень из этого числа. Поскольку в этом случае исключение не возникает, код внутри блока catch никогда не выполняется. Результат будет примерно таким:

Enter a number: 9 The sqrt of 9 is 3

Если пользователь вводит отрицательное число, мы генерируем исключение типа const char* . Поскольку мы находимся в блоке try и соответствующий обработчик исключений найден, управление немедленно передается обработчику исключений const char* . Результат:

Enter a number: -4 Error: Can not take sqrt of negative number

К настоящему моменту вы должны понять основную идею исключений. В следующем уроке мы приведем еще немало примеров, чтобы показать, насколько гибкими они являются.

Что обычно делают блоки catch

Если исключение направлено в блок catch , оно считается «обработанным», даже если этот блок catch пуст. Однако обычно вы захотите, чтобы блоки catch делали что-то полезное. Блоки catch выполняют три общих действия, когда перехватывают исключение:

  1. во-первых, блоки catch могут выводить сообщение об ошибке (либо в консоль, либо в лог-файл);
  2. во-вторых, блоки catch могут возвращать вызывающей функции значение или код ошибки.
  3. в-третьих, блок catch может выбросить другое исключение. Поскольку блок catch находится за пределами блока try , вновь созданное исключение в этом случае не обрабатывается предыдущим блоком try – оно обрабатывается следующим охватывающим блоком try .

Источник: radioprog.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru