Будет ли попытка утверждения, как эта работа?

Могу ли я поместить только одну всеобъемлющую инструкцию try-catch в мою основную функцию, которая охватывает всю программу? Или все функции требуют своих собственных? Я имею в виду, будет ли что-то вроде этой работы:

int main(){
try{
foo();
bar();
};

catch(char* e){
//Do stuff with e
};
};

void foo(){throw "You'll never reach the bar.";};
void bar(){throw "Told you so.";};

Если нет, то есть ли подобный способ, которым это можно сделать?

-3

Решение

Могу ли я поместить только один всеобъемлющий оператор try-catch в свой основной
функция, которая охватывает всю программу?

Да. catch (...) ловит все

#include <iostream>

int main()
{
try
{
// do something
}
catch (...)
{
std::cerr << "exception caught\n";
}
}

Или все функции требуют своих собственных?

Нет. Это победило бы всю цель исключений.

catch(char* e){
//Do stuff with e
};

Этот код является результатом неправильного понимания того, что исключения являются сообщениями об ошибках. Исключения не являются сообщениями об ошибках. Исключения в C ++ могут быть любого типа. Это включает char*Конечно, но это совершенно не имеет смысла.

Что вы действительно хотите сделать, это поймать std::exception, который включает в себя сообщение об ошибке, доступное через what() функция-член. Хорошо написанный код C ++ только генерирует исключения типа std::exception или производные классы. Можете добавить ... как запасной вариант для всех остальных случаев:

 #include <iostream>
#include <exception>

int main()
{
try
{
// do something
}
catch (std::exception const& exc)
{
std::cerr << exc.what() << "\n";
}
catch (...)
{
std::cerr << "unknown exception caught\n";
}
}
throw "You'll never reach the bar.";

Следовательно, выбрасывать массивы символов неправильно. Это неправильно на техническом уровне, если вы ожидаете char const[] быть преобразованным в char*, но это особенно неправильно на уровне дизайна. Замените массив выделенным типом исключения, например std::runtime_error:

throw std::runtime_error("You'll never reach the bar.");
1

Другие решения

Ваш пример не сработает, потому что

  • Декларация foo() а также bar() не перед их использованием.
  • Существует дополнительная точка с запятой между блоком после try а также catch,
  • Что передается throw является const char*, но ты поймал только char*,

Этот пример сработал.

#include <iostream>

void foo();
void bar();

int main(){
try{
foo();
bar();
}

catch(const char* e){
//Do stuff with e
std::cout << e << std::endl;
}
}

void foo(){throw "You'll never reach the bar.";}
void bar(){throw "Told you so.";}
2

По вопросам рекламы [email protected]