我有一些关于在C ++中抛出异常的问题。 据我所知,他们......
可以从main()函数中抛出异常。任何可以在main()函数中抛出异常的代码块都应该被try和catch语句包围,如下所示
void foo(//args) {
if (...) {
throw "Error reached";
} ...
int main() {
...
try {
//Code that can throw an excpetion
} catch(const char* msg) (
cerr << msg << endl;
}
...
}
在上面的例子中,为什么catch的参数是一个const char *。 C ++不允许使用字符串吗?另外,是否可以抛出一个不是const char *的异常,就像一个int?还是一个炭?
在foo中抛出异常,终止foo函数吗?
是否有可以将try和catch语句放在与throw相同的函数中的情况?
对不起,如果这些是基本问题。 谢谢你
答案 0 :(得分:6)
为什么catch的参数是一个const char *
因为你把字符串文字扔到了const char*
。简而言之,你抓住你扔的东西。
C ++不允许使用字符串吗?
确实如此,但是为了捕捉字符串,你需要首先抛出字符串。
是否可以抛出一个不是const char *的异常,
你可以扔任何东西。抛出特殊的异常类是个好主意,比如std::exception
并从中派生出来。
在foo中抛出异常,终止foo函数吗?
是的,确实如此。
是否存在可以将try和catch语句放在与throw相同的函数中的情况?
如果你愿意,你可以这样做。做这件事的情况并不多。
看起来你需要一本好书并阅读关于例外的章节。在此期间this super-FAQ entry可能会帮助您/
答案 1 :(得分:2)
您可以抛出任何类型的对象。
编辑:(希望我现在能做到这一点)
你所做的是抛出一个C字符串,在这种情况下是const char[13]
类型。 C-Arrays将衰减为指向其第一个元素的指针,在本例中为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语句放在任何位置。但是,请记住术语&#34;例外&#34;实际意味着。使用简单的条件表达式if (n < 0) break;
或类似的东西可以轻松处理的案例,不需要异常处理。特别是如果你能够真实地期望这种不需要的条件经常是真实的。然后它不是&#34;特殊&#34;。
如果您决定使用异常处理错误,并且可以在本地处理不,则可以在main()的开头和结尾放置try / catch子句。
由于您可以在try语句后直接放置几个 catch语句,然后您可以开始处理更具体的错误,或者只是通过{{1}捕获任何 }。
这一切都在非常详细地描述(包括时和当不是时使用它的指针,在C++ FAQ中。
编辑:以下是使用try / catch语句的示例。但是,没有捕获异常对象,而是一个int(错误)。只是为了证明,你可以真正地抛出/抓住任何你喜欢的东西。让catch(...) { //... }
成为嵌套在代码中的函数:
process_several_files()