Есть ли случай где с помощью выгоды весь пункт: выгода (…) выравнивается по ширине?

Существует 'ncftp', который доступен для установки в Linux. Это работает над протоколом FTP и может использоваться для загрузки файлов и папок рекурсивно. работы над Linux. Использовался и хорошо работает для рекурсивной папки/передачи файлов.

Проверка эта ссылка... http://www.ncftp.com/

5
задан Cœur 13 December 2017 в 05:39
поделиться

8 ответов

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

И если те же самые исключения не перехватываются, вы получаете ... бессвязное окно сообщения.

catch (...) позволяет мне, по крайней мере, показать мое собственное окно сообщения (и вызвать пользовательское ведение журнала, сохранить аварийный дамп, и т. д. ]).

Я думаю, что в деструкторах также есть разумное использование catch (...). Деструкторы не могут выбросить - ну, я имею в виду, они могут выбросить, но если деструктор выбрасывает во время раскрутки стека из-за незавершенного исключения, программа завершается, поэтому они не должны допускать исключения исключений. В общем, лучше позволить первому исключению продолжать разворачиваться, чем завершать программу.

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

4
ответ дан 18 December 2019 в 07:29
поделиться

В общем случае это оправдано, когда вы регистрируете исключение (или делаете что-то подобное) или выполняете некоторую очистку, , а затем немедленно повторно генерируете .

В C ++ в частности, запись в блоке catch (...) довольно бессмысленна, поскольку у вас нет никакого способа получить исключение, а очистка бессмысленна, потому что вы должны использовать для этого RAII. Использование его в деструкторах кажется единственным законным случаем.

5
ответ дан 18 December 2019 в 07:29
поделиться

(1) Неверно, что оператор перехватывает исключения ОС. Использование вами термина «Нарушение доступа» выдает фон Windows; это было верно для более старых версий MSVC ++.

(2) Тем не менее, универсальное поведение полезно для потоков с определенными целями. Обнаружение сбоя позволяет потоку сообщить о сбое. Без него другие части программы должны иметь дело с возможностью просто исчезновения потока. Это также позволяет вам регистрировать , который поток завершился ошибкой, и аргументы, используемые для запуска потока.

6
ответ дан 18 December 2019 в 07:29
поделиться
  1. try {...} catch (...) необходим вокруг тела функции обратного вызова, которая вызывается из кода который не понимает исключения C ++ (обычно библиотека C).

    В противном случае, если какая-либо библиотека C ++, которую вы используете, выдает исключение, которое не является производным от std :: exception, это, вероятно, приведет к сбою вызывающего кода или повреждению его внутреннего состояния.
    Вместо этого вы должны поймать это исключение и либо немедленно завершить программу, либо вернуть код ошибки (что означает «мы обречены, и я не знаю почему», но все же лучше затем пропускание исключения C ++)

  2. Вокруг процедуры потока. В основном по той же причине, что и 1. И поскольку в противном случае сбой потока остался бы незамеченным.

2
ответ дан 18 December 2019 в 07:29
поделиться

В дополнение к тому, что уже было сказано в других плакатах, я хотел бы упомянуть один приятный момент из Стандарта C ++:

Если соответствующий обработчик не найден в программа, функция std :: terminate () называется; независимо от того, является ли стек размотан перед этим вызовом std :: terminate () - это определяется реализацией .

(15.3 / 9)

Это означает, что main () и каждая функция потока должны быть заключены в общий обработчик; в противном случае нельзя даже быть уверенным, что деструкторы для автоматических объектов будут вызваны, если будет сгенерировано неперехваченное исключение.

3
ответ дан 18 December 2019 в 07:29
поделиться

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

Первый мой общая безопасность приложения. Если выбрасывать исключения, которые не являются производными от std :: exception , нет-нет, у меня есть одно на всякий случай в моей функции main () :

int execute(void); // real program lies here

int main(void)
{
    try
    {
        return execute();
    }
    catch(const std::exception& e)
    {
        // or similar
        std::cerr << "Unhandled exception: " << e.what() << std::endl;
        return EXIT_FAILURE;
    }
    catch(...)
    {
        std::cerr << "Unknown exception!" << std::endl;
        return EXIT_FAILURE;
    }
}

Теперь это только там «на всякий случай», и это не толком оправдано. Не должно быть никаких причин для того, чтобы когда-либо вводить эту оговорку, так как это будет означать, что кто-то совершил плохую вещь. Обратите внимание, насколько на самом деле бесполезно это утверждение; "Произошло что-то плохое, понятия не имею, что!" Это всего лишь ступенька выше, чем просто сбой.

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

2
ответ дан 18 December 2019 в 07:29
поделиться

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

1
ответ дан 18 December 2019 в 07:29
поделиться

catch (...) необходим при отсутствии предложения finally, как в других языках:

try {
  ...
} catch(...) {
  cleanup...
  throw;
}

Альтернатива - создание объектов стека, чтобы «владеть» всем - часто намного сложнее код и менее читаемый и обслуживаемый. API платформы часто - это C, и он не поставляется в удобной комплектации.

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

Наконец, бывают случаи, когда вас действительно не волнует исход чего-то.

-2
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: