主要之前和之后的异常处理

时间:2010-01-08 08:23:54

标签: c++ exception-handling main

是否可以在这些情况下处理异常:

  1. 在进入main()
  2. 之前从构造函数抛出
  3. 离开main()
  4. 后从析构函数抛出

4 个答案:

答案 0 :(得分:22)

  1. 你可以用你的try-catch包装构造函数。
  2. 不,你应该从不允许在析构函数中抛出异常。
  3. 如何在构造函数中嵌入try-catch的有趣鲜为人知的特性:

    object::object( int param )
    try
      : optional( initialization )
    {
       // ...
    }
    catch(...)
    {
       // ...
    }
    

    是的,有效的C ++。这里增加的好处是try会捕获由类的数据成员的构造函数抛出的异常,即使它们未在ctor初始化程序中提及或者没有ctor初始化程序:

    struct Throws {
      int answer;
      Throws() : answer(((throw std::runtime_error("whoosh!")), 42)) {}
    };
    
    struct Contains {
      Throws baseball;
      Contains() try {} catch (std::exception& e) { std::cerr << e.what() << '\n'; }
    };
    

答案 1 :(得分:4)

是:不要使用危险的全局对象!

答案 2 :(得分:0)

可以在构造/销毁有问题的对象之前设置异常处理程序,应该能够处理这些异常。

对于构造函数,有一些奇怪的新语法允许在构造函数中捕获异常。不确定它是如何工作的,并且它在许多编译器中并不常见。

对于析构函数,你必须在try {code();中包装析构函数的内容。 } catch(...){}阻止。这可能并不总是理想的行为,具体取决于您希望在析构函数中实现的目标。

答案 3 :(得分:0)

简答:不。

在其构造函数中抛出异常的任何全局对象都将导致未处理的异常(即,terminate被调用)。

任何在析构函数中抛出异常的类都是一个破坏的类。

使用单例模式而不是全局变量将为您提供更多选项。