Как использовать
Начиная с DAEMON Tools for Mac 6.2, вы можете обмениваться файлами между устройствами, подключенными к одной локальной сети, с помощью Catch!. Опция Catch! это часть Базового функционала, и она доступна всем пользователям.
После выхода DAEMON Tools Lite 10.8 в Play Market появился Catch! на Android и в App Store — DAEMON Catch! для iOS. Эти приложения позволяют вмиг обмениваться файлами, находясь в одной локальной сети. Узнайте больше о Catch! для Android и DAEMON Catch! для iOS.
Чтобы начать использовать Catch! кликните на иконку на боковой панели. Отскроется окно каталога устройств с Catch!:
Добавление устройств в Панель устройств
Чтобы добавить устройство, которого нет в Панели устройств, необходимо вызвать контекстное меню Панели устройств и выбрать Найти и добавить устройство из сети.
Сначала DAEMON Tools сканирует сеть, затем отображает список доступных устройств. Выберите устройство, которое хотите добавить, и нажмите Добавить.
Если в списке нет устройства, которое вы хотите добавить, можно ввести его IP address вручную.
Вы можете переименовывать устройства, находящиеся на панели устройств.
Удаление устройств из Панели устройств
Чтобы удалить девайс из Панели устройств откройте контекстное меню устройства, и выберите Забыть устройство.
После удаления, устройство не появится в Панели устройств даже при обновлении панели (вручную или автоматически). Если вы хотите вернуть устройство в Панель устройств, нужно повторить шаги по добавлению устройства.
Отправка файлов
Чтобы отправить файлы, выберите «Кинуть файл(ы)» из контекстного меню устройства.
DAEMON Tools for Mac должен быть запущен для обмена файлами.
Также можно отправить файлы прямо из Finder. Не нужно открывать DAEMON Tools, просто откройте контекстное меню одного или нескольких файлов, выберите Отправить с помощью Catch! и выберите получателя:
Стоит помнить, что если ваш Mac уйдет в спящий режим во время передачи файла, она не завершится и не возобновится после выхода из спящего режима. Вы увидите сообщение «Соединение потеряно», и чтобы отправить файл — нужно будет начать сначала.
Помните, что в контекстном меню Finder будут отображаться только устройства с Панели устройств DAEMON Tools.
Catch! — Перенос фото на ПК 4+
Просматривайте контент устройств, делитесь и получайте файлы по локальной Wi-Fi сети и объедините все свои мобильные и стационарные устройства в единую экосистему Catch!
Как быстро перенести фото с iPhone на ПК? Попробуйте Catch!
Знакомьтесь — Catch! — новое приложение от команды DAEMON Tools, которое позволяет перенести фото с iPhone на ПК всего за пару минут. Устанавливайте приложение из магазина, скачивайте DAEMON Tools для ПК и скидывайте файлы, фотографии, видео, документы и книги быстрее чем когда-либо.
Чем интересен Catch!?
— Возможность просмотреть фото с iPhone на ПК
— Возможность скинуть фото с айфона на ПК
— Быстрая и защищенная передача файлов
— Без использования мобильного трафика
— Без ограничений по форматам файлов
— Передавайте файлы абсолютно бесплатно!
Как передать файлы с ПК на iPhone?
— Запустите Catch! на своем iPhone
— Установите DAEMON Tools Lite или Ultra на ПК
— Убедитесь, что оба устройства в одной локальной сети
— Нажмите правой клавишей мыши по файлу в Проводнике или Finder
— Выберите опцию Отправить с помощью Catch!
— Готово! Файл будет доставлен на iPhone через мгновение
Как скинуть фото с айфона на ПК?
— Запустите Catch! на своем iPhone
— Установите DAEMON Tools Ultra на ПК
— Убедитесь, что оба устройства в одной локальной сети
— Запустите Ultra, вы увидите свой iPhone на панели устройств
— Нажмите правой клавишей мыши по iPhone и выберите опцию Открыть устройство в Ultra
— Готово! Все файлы доступны, выбирайте любой и копируйте на ПК
Как настроить резервное копирование iPhone-фото?
— Запустите Catch! на своем iPhone
— Установите DAEMON Tools Ultra на ПК
— Убедитесь, что оба устройства в одной локальной сети
— Выберите инструмент «Новая резервная копия» в Ultra
— Выберите iPhone в качестве Источника
— Настройте, что, когда и как копировать
— Запускайте Catch! на iPhone, чтобы начать копирование
Отправить с помощью catch что это
Catch!
версия: 3.3.710
Последнее обновление программы в шапке: 06.09.2021
Уважаемое сообщество 4PDA!
Просим вас принять участие в бета-тестировании нового приложения для обмена файлами между устройствами: Catch!
Ссылка на Google Play позволяет зарегистрироваться и установить себе тестовую версию.
Искренне надеемся на ваши комментарии и критику!
✸ Обменивайтесь файлами между устройствами ✸
Везде. Всегда. Все что вам нужно — только Wi-Fi!
Просто выберите несколько изображений из Галереи, файлов или папок из файловой системы и отправьте в одно касание!
Добавьте устройства в списко доверенных, и впредь все данные с них будут получаться автоматически.
✸ Храните все по местам ✸
Книги к книгам, музыка к музыке!
Вы можете назначить неограниченное число папок, чтобы сохранять файлы согласно их расширениям. Теперь все данные будут упорядочены, сохранены и всегда актуальны!
Требуется Android: 4.1+
Русский интерфейс: Да
Сообщение отредактировал esleer — 06.09.21, 18:30
Добрый день!
Что конкретно вам необходимо прояснить?
Да, сейчас передача происходит через WiFi — либо при условии нахождения устройств в одной публичной или домашней сети с маршрутизатором, либо созданной одним из устройств (hotspot).
Да, отсутствие регистрации в данной версии можно считать маркетинговым ходом. В следющих версиях это станет полноценным преимуществом из-за расширения функционала.
Говоря простым языком — вы правы. Просто демон, просто ждет что ему кто-то отправит файл.
Цель этой публикации — выяснить мнение сообщества по поводу этого приложения, Ваше мнение.
Пожалуйста, если вы считаете наше приложение нужным, удобным, полезным, или наоборот — попробуйте его на практие и выскажитесь об этом.
Заранее спасибо!
Спасибо.
Пока не пробовал, так что «Пастернака не читал, но осуждаю» (с).
Про безопасность Вы, думаю, и сами в курсе.
Много ли демон жрёт? Можно ли сделать его отключаемым (удобно)?
А в принципе даже не знаю нужная ли штука. Вряд ли программа станет так уж широко использоваться, так что скорее для узкого круга — напримеР, в пределах семьи и знакомых-приятелей.
Развивать именно интернет-функционал и облачные функции не вижу смысла, таких решений, мягко говоря, немало.
Спасибо.
Пока не пробовал, так что «Пастернака не читал, но осуждаю» (с).
Про безопасность Вы, думаю, и сами в курсе.
Много ли демон жрёт? Можно ли сделать его отключаемым (удобно)?
А в принципе даже не знаю нужная ли штука. Вряд ли программа станет так уж широко использоваться, так что скорее для узкого круга — напримеР, в пределах семьи и знакомых-приятелей.
Развивать именно интернет-функционал и облачные функции не вижу смысла, таких решений, мягко говоря, немало.
По поводу безопасности сейчас ведутся обсуждения внутри команды. В свете того, что как вы сами заметили, таких решений уйма, есть мнение выделиться как раз шифрованием и т. п.
А пока есть вот такая простая бетка.
Демон жрет немного. на Nexus 6 разницы с запущенным демоном или нет по расходу батареи не замечено. В принципе ничего не мешает его сделать отключаемым.
Программа catch что это
Язык С представляет программисту очень ограниченные возможности обработки исключений, возникших при работе программы. В этом отношении С++ намного развитее С. Здесь у программиста существенно большие возможности по непосредственной обработке исключений. Комитет по разработке стандартов С++ предоставил очень простую, но мощную форму обработки исключений.
Темные дни С
Типичная функция, написанная на С, выглядит примерно так:
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, ловящих «свой» тип данных:
С++ 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.
Передача файлов по локальной сети между устройствами 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 Catch!» для iOS и просто «Catch!» для Android , реализующие эту функцию, бесплатны. Бесплатно её можно использовать и в среде Windows: функция доступна в рамках свободной редакции программы Daemon Tools Lite. А вот для Мас бесплатной редакции Daemon Tools не существует. Есть только платная, стоит €9,99 , предусматривает трёхдневный триал-срок.
Рассмотрим подробнее принцип работы Catch! в разных системах.
2. Windows
Чтобы бесплатно использовать эту функцию в среде Windows, при установке Daemon Tools Lite выбираем «Free Licence».
Если программа автоматически не выберет русский язык, можем сами установить его в настройках.
Catch! в программе активна по умолчанию, её не нужно активировать и настраивать. Функция автоматически определяет IP -адрес компьютера и порт сети. Разве что можем подкорректировать под себя уже отдельные тонкости. Идём в её настройки.
Здесь можно, в частности:
• Включать/отключать саму функцию;
• Менять имя компьютера, как он будет видеться в сети в рамках использования Catch!;
• Менять путь сохранения получаемых файлов;
• Включать/отключать интеграцию функции в проводнике Windows.
Все находящиеся в локальной сети устройства с включённым ПО для работы Catch! будем видеть на панели внизу окна программы. Вызвав на значке нужного компьютера или гаджета контекстное меню, сможем перебросить на него данные опциями «Бросить файл» и «Бросить файлы из папки».
Компьютер-получатель на базе Windows в системном уведомлении запросит разрешение на принятие файлов. Если это разовая передача данных, даём, соответственно, разовое разрешение — жмём в уведомлении «Разрешить единожды». Если файлы принимаем со своего или доверенного компьютера, тогда даём постоянное разрешение – жмём «Разрешать всегда».
Когда данные будут получены, можем открыть папку их хранения «Catch!» прямо в системном уведомлении.
Эта папка отдельным пунктом отображается в проводнике Windows.
Полученные файлы будут аккуратно рассортированы по подпапкам с названиями устройств-отправителей. А чтобы сразу оказаться в нужной подпапке, просто делаем двойной клик по значку устройства-отправителя на панели внизу окна Daemon Tools.
Catch! интегрируется в проводник Windows, так что данные на другие компьютеры и гаджеты можем отправлять с помощью его контекстного меню.
В контекстном меню также есть опция «Обновить». Её можно использовать, когда другой компьютер или гаджет не обнаружились автоматически. Если и после этого они не стали видны, в окне Daemon Tools на панели внизу вызываем контекстное меню, кликаем «Найти и добавить устройство из сети».
Пробуем ещё раз обновить, чтобы устройство отобразилось автоматически. Если ничего не происходит, вводим вручную его IP -адрес.
3. Mac OS
В Mac OS принцип работы Catch! схож тем, что у Windows, только нет интеграции с Finder . Устанавливаем Daemon Tools. На панели внизу окна программы видим обнаруженные в локальной сети устройства. Выбираем нужное, вызываем на нём контекстное меню, кликаем «Кинуть файлы».
И, указываем, собственно, сами файлы в окне Finder.
Для приёма данных в системном уведомлении кликаем «Разрешить». Если это разовое получение данных с временно оказавшихся в сети компьютеров или гаджетов, предварительно снимаем галочку «Сохранить». Таким образом в дальнейшем для них разрешение будет запрашиваться вновь.
По итогу получения файлов можем открыть их папку хранения в системном уведомлении.
Либо просто открываем в Finder папку «Документы» , далее — подпапку «Catch!» , затем — подпапку с именем устройства.
Отключается/включается функция в настройках Daemon Tools. В настройках также можно сменить имя компьютера, как он будет отображаться в рамках использования Catch!. И задать иной путь сохранения полученных файлов по умолчанию.
Если нужный компьютер или гаджет не определяется, как и в Windows, в окне Daemon Tools вызываем на нижней панели контекстное меню и выбираем «Найти и добавить устройство из сети».
Пытаемся обновить информацию о подключениях. Если результата нет, вводим IP -адрес нужного компьютера или гаджета вручную.
Удаляются ненужные компьютеры и гаджеты из числа доверенных для работы с функцией в их контекстном меню на панели внизу окна Daemon Tools опцией «Забыть устройство». И в Windows, и в Мас. Для повторного добавления такого «забытого» компьютера или гаджета необходимо проделать описанные выше операции для поиска и добавления неотображаемого устройства.
4. Android
Приложение для Android «Catch!» являет собой заточенный под работу функции файловый менеджер с отдельными разделами для отображения картинок и аудиофайлов. Для передачи нужных данных на другое устройство в локальной сети выбираем их и жмём значок отправки.
Указываем принимающий компьютер или гаджет. Вот, собственно, и всё. Если нужное устройство не отображается, жмём кнопку-плюсик.
И вводим его IP -адрес.
Приём файлов с другой техники подтверждаем в системном уведомлении Android.
Полученные данные, если это изображения или аудиоконтент, отобразятся в разделах приложения, соответственно, «Галерея» и «Музыка». Остальные типы данных ищем в разделе «Файлы», в папке «Пойманные файлы».
Приложение «Daemon «Catch!» для iOS отличается дизайном, но принцип работы самой функции такой же, как и в приложении для Android.
Программа 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 времени проверяет не шлёт ли кто ему файл?
Активные пользователи
Реп: ( 4 )
А пояснее описать?
Если только через WiFi — значит, файлы не гонятся через инет? Регистрация — она зачем (маркетинг-оно понятно)? На устройстве просто открываются некие дополнительные порты и некий демон раз в N времени проверяет не шлёт ли кто ему файл?
Добрый день!
Что конкретно вам необходимо прояснить?
Да, сейчас передача происходит через WiFi — либо при условии нахождения устройств в одной публичной или домашней сети с маршрутизатором, либо созданной одним из устройств (hotspot).
Да, отсутствие регистрации в данной версии можно считать маркетинговым ходом. В следющих версиях это станет полноценным преимуществом из-за расширения функционала.
Говоря простым языком — вы правы. Просто демон, просто ждет что ему кто-то отправит файл.
Цель этой публикации — выяснить мнение сообщества по поводу этого приложения, Ваше мнение.
Пожалуйста, если вы считаете наше приложение нужным, удобным, полезным, или наоборот — попробуйте его на практие и выскажитесь об этом.
Заранее спасибо!
Друзья 4PDA
Реп: ( -1 )
Спасибо.
Пока не пробовал, так что «Пастернака не читал, но осуждаю» (с).
Про безопасность Вы, думаю, и сами в курсе.
Много ли демон жрёт? Можно ли сделать его отключаемым (удобно)?
А в принципе даже не знаю нужная ли штука. Вряд ли программа станет так уж широко использоваться, так что скорее для узкого круга — напримеР, в пределах семьи и знакомых-приятелей.
Развивать именно интернет-функционал и облачные функции не вижу смысла, таких решений, мягко говоря, немало.
Активные пользователи
Реп: ( 4 )
Спасибо.
Пока не пробовал, так что «Пастернака не читал, но осуждаю» (с).
Про безопасность Вы, думаю, и сами в курсе.
Много ли демон жрёт? Можно ли сделать его отключаемым (удобно)?
А в принципе даже не знаю нужная ли штука. Вряд ли программа станет так уж широко использоваться, так что скорее для узкого круга — напримеР, в пределах семьи и знакомых-приятелей.
Развивать именно интернет-функционал и облачные функции не вижу смысла, таких решений, мягко говоря, немало.
По поводу безопасности сейчас ведутся обсуждения внутри команды. В свете того, что как вы сами заметили, таких решений уйма, есть мнение выделиться как раз шифрованием и т. п.
А пока есть вот такая простая бетка.
Демон жрет немного. на Nexus 6 разницы с запущенным демоном или нет по расходу батареи не замечено. В принципе ничего не мешает его сделать отключаемым.
Спасибо вам большое за отзыв!
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 выполняют три общих действия, когда перехватывают исключение: