Могу ли я поместить только одну всеобъемлющую инструкцию 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.";};
Если нет, то есть ли подобный способ, которым это можно сделать?
Могу ли я поместить только один всеобъемлющий оператор 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.");
Ваш пример не сработает, потому что
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.";}