Все выданные исключения должны быть уникальными
Все выданные исключения должны быть уникальными.
Если один и тот же объект возникает как исключения в нескольких местах, обработка этих исключений и отладка кода могут оказаться трудными. Создание уникальных объектов исключения упрощает процесс отладки. Рассмотрим этот код, где возникает несколько исключений.
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 не помечает его, если литерал не является константой или если литерал скрыт за переменной.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Обработка исключений |
Категория: Консультационные, Автоматизированные |