Когда лучше использовать exit () против исключений в c ++? - PullRequest
0 голосов
/ 29 сентября 2019

Я пишу программу, в которой в зависимости от входных значений код завершается.Это заставило меня задуматься о том, как лучше всего это реализовать.Я легко могу привести два примера:

if (bad_value) {
    clean_up();
    exit(1);
}

и что-то вроде этого

try
    myFunc();
catch myException {
    clean_up();
    exit(1);
}

int myFunc() {
    if (badValue) throw myException;
    ...
}

Первый блок кода выглядит намного чище, поэтому я удивляюсь, почему вы захотите когда-либо использовать исключения?Я думаю, что это действительно битва c против c++.

Ответы [ 4 ]

1 голос
/ 29 сентября 2019

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

Вторая проблема: даже если вы хотите завершить работу, сложно написать одну функцию clean_up(), которая бы заботилась обо всех ресурсах, выделенных в различных частях программы.Это то, что RAII в C ++ для.exit() несовместимо с RAII, так как не вызывает деструкторы, кроме глобальных или статических объектов.

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

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

1 голос
/ 29 сентября 2019

Вы правы, это в значительной степени вопрос стиля C против стиля C ++.

Идиома C передачи флага pass / fail означает, что вы должны явно проверить наличиеошибка в каждом месте, где это может произойти.И если этот флаг нужно передавать дальше вверх по стеку вызовов, каждая функция должна разрешать его.Очень быстро это может стать громоздким.

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

1 голос
/ 29 сентября 2019

Не следует использовать exit().Чтобы не вызывать все деструкторы, вы должны использовать std::quick_exit().

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

1 голос
/ 29 сентября 2019

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

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

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