В C ++ каковы преимущества использования исключений и try / catch вместо простого возврата кода ошибки? - PullRequest
23 голосов
/ 13 октября 2008

Я давно программирую на C и C ++ и до сих пор никогда не использовал исключения и try / catch. Каковы преимущества использования этого вместо того, чтобы просто иметь функции, возвращающие коды ошибок?

Ответы [ 13 ]

1 голос
/ 13 октября 2008

Тот факт, что вы должны признать исключения, является правильным, но это также может быть реализовано с использованием структур ошибок. Вы можете создать базовый класс ошибок, который проверяет в своем dtor, был ли вызван определенный метод (например, IsOk). Если нет, вы можете что-то записать в журнал, а затем выйти, либо сгенерировать исключение, либо вызвать assert, и т.д ...

Простой вызов IsOk для объекта ошибки без реагирования на него будет эквивалентен записи catch (...) {} Оба утверждения показали бы одинаковое отсутствие доброй воли программиста.

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

1 голос
/ 13 октября 2008

Иногда вам действительно нужно использовать исключение, чтобы отметить исключительный случай. Например, если что-то пойдет не так в конструкторе, и вы обнаружите, что имеет смысл уведомить вызывающего об этом, у вас нет другого выбора, кроме как вызвать исключение.

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

int divide(int a, int b)
{
    if( b == 0 )
        // then what?  no integer can be used for an error flag!
    else
        return a / b;
}
0 голосов
/ 13 октября 2008

Как указал @Martin, выдача исключений заставляет программиста обрабатывать ошибку. Например, не проверка кодов возврата является одним из самых больших источников дыр в безопасности в программах на Си. Исключения гарантируют, что вы обработаете ошибку (надеюсь) и предоставите какой-нибудь путь восстановления для вашей программы. И если вы решите игнорировать исключение, а не вводить дыру в безопасности, ваша программа вылетает.

...