C ++ - 关于抛出异常的几个问题

时间:2016-02-20 20:44:09

标签: c++ exception

我有一些关于在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相同的函数中的情况?

对不起,如果这些是基本问题。 谢谢你

2 个答案:

答案 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_errorstd::range_errorstd::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()