Все выданные исключения должны быть уникальными
Все выданные исключения должны быть уникальными.
Если один и тот же объект возникает как исключения в нескольких местах, обработка этих исключений и отладка кода могут оказаться трудными. Создание уникальных объектов исключения упрощает процесс отладки. Рассмотрим этот код, где возникает несколько исключений.
void f1(){
//...
throw std::logic_error("Error");
}
void f2(){
//...
throw std::logic_error("Error");
}
void f3(){
//...
throw std::logic_error("f3: Unexpected Condition");
}
int main(){
try{
f1();
f2();
f3();
catch(std::logic_error& e){
std::cout << e.what() << '\n';
}
}
}f1() и f2() поднимает то же исключение, в то время как f3() создает уникальное исключение. Во время отладки вы не можете определить, возникает ли исключение из f1() или f2(). Вы знаете, когда из-за этого возникает исключение f3(). Чтобы упростить процесс отладки, создайте уникальные исключения. Исключение уникально, если одно из следующих условий верно:
Тип исключения не встречается в другом месте вашего проекта.
Сообщение об ошибке или код ошибки не появляются в другом месте вашего проекта.
Polyspace® подсвечивает throw операторы, которые повышают тот же класс, значение перечисления, целое число или постоянный литерал, что и исключения, и помечают оператор final throw, который поднимает тот же объект. Можно хотеть поднять одно и то же исключение в нескольких местах при помощи предконструированного объекта исключения. Polyspace не помечает throw операторы, которые поднимают такие предварительно сконструированные объекты исключений. Если вы поднимаете один и тот же буквальный объект в нескольких местах, Polyspace не помечает его, если литерал не является константой или если литерал скрыт за переменной.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: Обработка исключений |
| Категория: Консультационные, Автоматизированные |