Как я понимаю ваш вопрос, вы хотите объявить некоторые пользовательские типы исключений для чистой обработки ошибок.Это хорошо, и следующий код будет примером того, как это можно сделать.Это всего лишь пример, показывающий, что возможно.
0: Понимание throw
Подробнее о throw можно прочитать здесь .Но в целом можно бросить что угодно.throw 1;
, например, сгенерирует int.Ваш пример throw "Invalid Expression"
будет выбрасывать const char*
.Обычно вы хотите выбросить объект класса, который наследуется от std::exception
.
1: Объявите класс для каждого типа исключения, которое вам нужно обработать
Хорошей практикой является позволить им расширятьсяиз std :: исключение.В конструкторе я обычно создаю сообщение об исключении и передаю его конструктору std::exception
.Ниже приведены лишь примеры:
class ExceptionA : public std::exception {
public:
ExceptionA() : std::exception("Case A occurred!") { }
};
class ExceptionB : public std::exception {
public:
static string CreateMessage(int x, int y) {
// You can create a custom exception message here
}
ExceptionB(int x, int y) : std::exception(ExceptionB::CreateMessage(x, y)) {}
};
Как видно из ExceptionB
, совершенно нормально добавлять дополнительные данные к вашему исключению.Это поможет вам создать более конкретное сообщение об исключении.
2: Сориентируйте ваш код с помощью try-multicatch
Подробнее об этом можно прочитать здесь Это значит,Вы можете использовать несколько блоков catch для каждого блока try.
void foo() {
try {
// Calcultion starts here
// Now you get unexpected input or something like this and signal it by throwing an exception.
if(errorCondition) { throw ExceptionA(); }
// Something else might happen here, so you throw the other type of exception
// in this example ExceptionB also takes two custom parameters.
if(otherErrorCondition) { throw ExceptionB(x, y); }
}
catch(ExceptionA &e) {
// Handle an occurence of Exception A
}
catch(ExceptionB &e) {
// Handle an occurence of Exception B
}
catch(std::exception &e) {
// Handle an occurrence of any other exceptions STL-components migth throw for example std::range_error
}
catch(...) {
// Handle the occurrence of any other thrown ... things. This will also catch things like throw 1, but usually you don't need this.
}
}
Здесь важен порядок блоков catch!
3: наслаждайтесь чистой обработкой исключений!
Надеюсь, это ответит на ваш вопрос!