2012-05-15 4 views
3

Я искал мнение об использовании std::logic_error вместо использования сложного списка вложенных if/elseif return true/false.std :: logic_error вместо return false

Я хотел бы перейти от многих аналогичных функций, как один ниже

bool validate_data(){ 
    std::vector<int> v; 
    //fill with data 
    if(v.find(10) == v.end()){ 
     return false; 
    } 
    // other checks that return false 
} 

в

bool validate_data(){ 
    std::vector<int> v; 
    //fill with data 
    if(v.find(10) == v.end()){ 
     throw std::logic_error("error message"); 
    } 
    // other checks that return false 
} 

и назвать все это список функций в одном try-catch блоке.

Поскольку это производное от std::exception, вероятно, я не знаю, хорошая ли это идея.

Кто-нибудь может использовать пример ниже?

Большое спасибо

AFG

+1

У вас будет такой же сложный код if/elseif с 'throw' вместо' return'. В чем преимущество? –

+0

@Tadeusz: поскольку все происходит в одном отказе проверки, я могу написать менее сложный код, т. Е. Просто список вызовов этих функций проверки в одном предложении try/catch. –

ответ

5

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

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

+1

Привет, Деннис! Танки для ответа (вскоре после этого). Несколько раз после того, как я преодолел эту дилемму, я также сказал бы, что, за исключением этого, он должен прийти и к методам «исключений-безопасности». Без этого я нашел свои программы «Незавершенными» и не совсем безопасными. Теперь я использую для этого расширение для увеличения. http://www.boost.org/doc/libs/1_52_0/libs/scope_exit/doc/html/index.html –

2

Поскольку ваша функция называется validate_data() я только бросить исключение, если есть какая-то внутренняя ошибка в функции и использовать true или false, чтобы указать, что функция сделал Validate вход, но он был либо valid (return true), либо недействительным (return false).

Это не помешает вам создать несколько конструкций if() else if() else, но это сделает код более чистым и легче отличить, были ли данные недопустимы или произошла внутренняя ошибка.

try { 
    bool valid = validate_data(foo); 
    /* process data or break if invalid */ 
} catch (std::exception &ex) { 
    /* internal error happened */ 
} 

как вы можете видеть, это сделает ваш код длиннее, ИМХО чище.

5

Используйте исключения только для исключительных ситуаций.

Не находите значение 10 исключительной ситуации? Или это нормальная ситуация?

Переименование вашего метода из validate_data в is_data_valid делает его более понятным. Если метод возвращает true, он действителен. Если он возвращает false, это не так. Не нужно использовать исключения для этого.

+0

Документация std :: logic_error говорит: «Класс служит базовым классом для всех исключений, которые были отправлены, чтобы сообщать о ошибках, предположительно обнаруживаемых до выполнения программы, таких как нарушения логических предварительных условий». COULD означает, что я могу использовать его вместо утверждения?Это может также привести к тому, что вы говорите о действительных/недействительных и исключительных случаях. –

+0

Если нарушение логического предусловия означает, что в приложении есть ошибка, используйте assert. Если нарушение означает, что пользователь указал неверный ввод, просто сообщите об ошибке пользователю. Что касается исключений, я бы использовал исключения только в том случае, если вы уверены, что будете обрабатывать их последовательно в своем приложении. Это означает, что ВСЕ ваши методы могут обрабатывать остановку в середине выполнения. В моем случае у меня все еще есть много кода в простой C, поэтому мне не нравится добавлять исключения в мое приложение. – Patrick

Смежные вопросы