Как выводить строчку, на которой было выброшено исключение?

Здравствуйте.
Мне требуется определить несколько собственных типов данных, для которых определенны какие то операции, которые могут выбрасывать ошибки. Как пример:
int main() {
    int length = 10;
    auto arr = MyAwesomeArray<int>(length);
    arr[15] = 2; // IndexOutOfRangeException();

    return 0;
}


Я описал класс ошибки таким образом

class IndexOutOfRangeException : public std::exception {
private:
    std::string m_error;

public:
    explicit IndexOutOfRangeException(std::string error) : m_error(std::move(error)) {}

    const char *what() const noexcept override { return m_error.c_str(); }
};

Который выдает такое сообщение

terminate called after throwing an instance of 'IndexOutOfRangeException'
  what():  some error message

И все хорошо работает (ошибка вызывается, программа завершается).

Но в таком случае крайне неудобно пользоваться этими ошибками, потому что в данном сообщении не показывается ни файл, ни строка, на которой было выброшено исключение. Как сделать такой же (или похожий) вывод, как и для стандартных ошибок?
test.cpp: In function ‘int main()’:
test.cpp:29:5: error: ‘foobar’ was not declared in this scope
   29 |     foobar();
      |     ^~~~~~
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Есть замечательная функциональность: https://en.cppreference.com/w/cpp/utility/source_l...
Доступна начиная с C++20. Буду образовывать заодно и местных экспертов :)
Ну или макросы.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Важно понимать, что на момент выполнения программы (runtime) информации об исходном тексте программы уже нет в наличии.

Варианты
1) Собирать программу с отладочной информацией и при вылете исключения парсить стек, аналогино тому, как это делает отладчик.
2) Делать catch на каждую строчку и использовать макросы __FILE__ и __LINE__
Ответ написан
Adamos
@Adamos
Вы идете поперек идеологии С++, предполагающей, что скомпилированный код будет делать только то, что реально нужно алгоритму. Для того же, чтобы делать еще кучу всякого на тот случай, когда надо будет показать горе-программисту, где он облажался - есть многие и многие другие языки.
Право, если бы был простой и естественный способ сделать такую отладочную информацию - неужели вы думаете, что разработчики STL не использовали бы такую возможность?
С другой стороны, исключение вызывается методом контейнера и в него передается строка. Можно же добавить в эту строку некоторые данные самого контейнера, которые могут быть полезны при исследовании ошибки - его реальную длину, тип, ошибочный индекс....
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы