Main

时间:2017-02-14 18:35:21

标签: c++ exception-handling main

我有一个可以在构造函数中抛出异常的类。我不知道拥有此类的代码,因此我无法更改此行为或向此类添加其他实例化或初始化方法。我需要在main中创建这个类的对象。这是否意味着我需要一个main()主要包含一个巨大的try / catch块,如下所示:

main()
{
  try
  {
    A a;
    ...
  }
  catch(std::exception& e)
  {
    std::cout << e.what() << std::endl;
    return EXIT_FAILURE;
  }
  return EXIT_SUCCESS;
}

如果这个主要是数千行长?这个try / catch块是巨大的。我觉得应该有一个更好的方法,但我想不出一个。

4 个答案:

答案 0 :(得分:4)

  

这是否意味着我需要一个主要由一个巨大的try / catch块组成的main()

  

如果这个主要是数千行,怎么办?

不应该。不要这样做。将您的功能转换为功能

不要忘记main()的返回类型(int)。

答案 1 :(得分:4)

  

如果这个主要长数千行怎么办?   ......我觉得应该有一个更好的办法,但我想不出一个。

这显然是糟糕设计的标志,应该重构进入类和函数调用。

理想情况下,在main()

中使用此类似内容
int main(int argc, char* argv[]) {
    try {
        Application app(argc,argv);
        app.run();
    }
    catch(std::exception& e) {
         std::cout << e.what() << std::endl;
         return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}      

仍然是

try {
    // Refactored 1000 lines of code
}
catch(std::exception& e) {
    std::cout << e.what() << std::endl;
    return EXIT_FAILURE;
}

必须包含调用代码。

答案 2 :(得分:1)

有几种不同的方法可以解决这个问题。

main():{/ p>的正文周围放置一个function-try-block

int main() try
{
  A a;
  // use 'a' as needed ...
  return EXIT_SUCCESS;
}
catch (const std::exception& e)
{
  std::cout << e.what() << std::endl;
  return EXIT_FAILURE;
}

重构代码,将大部分main()移动到另一个函数,然后可以在try/except块内调用:

void run()
{
  A a;
  // use 'a' as needed ...
}

int main()
{
  try
  {
    run();
    return EXIT_SUCCESS;
  }
  catch (const std::exception& e)
  {
    std::cout << e.what() << std::endl;
    return EXIT_FAILURE;
  }
}

就个人而言,我只是在堆上而不是堆栈上实例化类。这样,您可以将try/catch放在实例化的周围:

#include <memory>

int main()
{
  std::unique_ptr<A> a; // or std::auto_ptr<A> prior to C++11...

  try
  {
    a.reset(new A);
    // or, in C++14 and later:
    // a = std::make_unique<A>();
  }
  catch(const std::exception& e)
  {
    std::cout << e.what() << std::endl;
    return EXIT_FAILURE;
  }

  // use 'a' as needed ...

  // the A object is freed automatically when 'a' goes out of scope...

  return EXIT_SUCCESS;
}

答案 3 :(得分:0)

如果您没有合理的方法来处理异常,那么请不要担心try阻止。只是让异常逃脱并取消该计划 - 另一种方法是继续这个&#34;世界&#34;不是一个理智的状态 - 不是一个好主意。 当你没有理智处理错误时崩溃是合理的。捕获异常是你应该只做如果你有合理的方法来处理它们。默认情况下,只是让它们传播。

如果可以明智地处理异常,请在对象实例化周围添加try块,然后在catch块中进行合理的错误处理