2016-03-26 2 views
0

Я все еще новичок, и я действительно не понимаю цели исключений в программе.Вопросы об использовании исключений

Когда вы бросаете исключение, вы в основном пропускаете (небольшую или большую) часть своей программы, поэтому один из моих вопросов будет: должен ли исключение приводить к концу программы?

Кроме того, предположим, что у нас есть класс Rectangle. Это было бы определить по его длину и высоту, как это:

#include <iostream> 

using namespace std; 

class Rectangle { 
public: 
    Rectangle(double length, double height) 
    { 
     if (length > 0 and heigth > 0) { 
      length_ = length; 
      height_ = height; 
     } 
     else { 
      // Throw an exception ? Use a convention ? 
     } 
    } 
    // other methods 
private: 
    double length_; 
    double height_; 
}; 

int main() { 
    // do stuff 

    return 0; 
} 

Однако, это не будет иметь большого смысла иметь отрицательную длину или высоту. Так должен ли я сделать исключение в конструкторе? Должен ли я использовать произвольное соглашение и принимать их абсолютную ценность? Должен ли я запретить пользователю в main() передавать отрицательные аргументы?

+1

как ... Там нет ничего плохого в том, графический интерфейс проверки данных перед передачей его к объекту. Также, если объект защищает себя в конструкторе, это правильный путь. Почему оба? потому что иногда у вас нет контроля над обоими ... иногда ваш программист GUI и объект находятся вне вашего контроля. Иногда вы пишете объект, и вы не знаете, как будет использоваться этот объект. Когда вы передаете исключение в конструкторе, это потому, что у вас есть контракт с тем, кто когда-либо использовал ваш объект. Когда они нарушают этот контракт, вы получаете исключение. –

ответ

1

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

#include <iostream> 
#include <exception> 

using namespace std; 

struct Rectangle_exception : public std::runtime_error { 
     Rectangle_exception(const char* const message): std::runtime_error(message) {} 
}; 

class Rectangle { 
public: 
    Rectangle(double length, double height) 
    { 
     if (length > 0 && heigth > 0) { 
      length_ = length; 
      height_ = height; 
     } 
     else { 
      throw Rectangle_exception{"Invalid dimensions."}; 
     } 
    } 
    // other methods 
private: 
    double length_; 
    double height_; 
}; 

Для получения дополнительной информации об исключениях смотрите в этом FAQ или «наилучшей практики» обработки ошибок в C++ в разделе ошибок CppCoreGuidelines

Иногда исключения не желательны (потому что ваша компания не решила использовать их), но вы все еще хотите иметь некоторые утверждения. CppCoreGuiidelines предлагает макросы (и хочет использовать язык) с именем Expects и Ensures. Планируется, что вы можете указать предварительные условия и постусловия в интерфейсе. На данный момент это могут быть макросы с различным поведением в зависимости от ваших флагов компилятора. Сведения о реализации см here или here

class Rectangle { 
public: 
    Rectangle(double length, double height) 
    { 
     Expects(length > 0 && height > 0); 
     length_ = length; 
     height_ = height; 
    } 
    // other methods 
private: 
    double length_; 
    double height_; 
}; 
Смежные вопросы