你可以抛出任何类型的对象。
编辑:(希望我现在明白了)
您所做的是抛出一个 C 字符串,在本例中为 const char[13] 类型。 C 数组将衰减为指向其第一个元素的指针,在本例中为 const char* 类型的指针。
通常你想要做的是抛出一个预定义的异常对象。它们可以在标题 <stdexcept> 中找到,并且是从基类 std::exception派生。派生的异常类例如是std::logic_error、std::range_error、std::bad_alloc 等。
他们的构造函数接受一个字符串作为参数,所以你可以举例
throw std::logic_error{"Negative values not allowed."};
可以在如下的 catch 语句中访问此消息:
catch(std::exception &e) // capture reference to base class
{
std::cout << e.what() << '\n'; // what() of derived is called, since virtual
}
如果捕获到异常,就会发生所谓的堆栈展开。然后,您可以在本地处理错误,或重新抛出异常。只有当一个异常被抛出并且从未被捕获时,std::terminate() 才被称为程序中止。
您可以将 try/catch 语句放在任何地方。但是,请记住术语“异常”的实际含义。使用简单的条件表达式if (n < 0) break; 或类似的东西可以轻松处理的情况,不需要异常处理。特别是如果您可以现实地期望这种不需要的情况经常发生。那么它就不是什么“异常”了。
如果您决定使用异常来处理错误并且它们不能在本地处理,您可以在 main() 的开头和结尾放置 try/catch 子句。
由于您可以将 几个 catch 语句直接放在 try 语句之后,因此您可以开始处理更具体的错误,或者通过 catch(...) { //... } 简单地捕获 anything。
这一切都被详细描述(包括在 when 和 when not 使用它的指针,在C++ FAQ。
编辑:这是一个使用 try/catch 语句的示例。但是,捕获的不是异常对象,而是一个 int (errno)。只是为了表明,你真的可以扔/抓任何你喜欢的东西。让process_several_files() 成为嵌套在代码中某处的函数:
std::vector<std::string> process_several_files(std::vector<std::string> const& files)
{
std::vector<std::string> contents{};
contents.reserve(files.size()); // files contains file names from user input
for (auto const& file : files)
{
try
{
contents.emplace_back(get_file_contents(file.c_str())); // A "C like" function. get_file_contents() will throw "errno", if a file does not exist
}
catch(int err)
{
std::cerr << "***Error while opening " << file << " : " << std::strerror(err) << "***\n";
continue; // "scope" didn't change, just keep iterating!
}
}
return contents;
}