Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 主控台上的巨大试捕挡块_C++_Exception Handling_Main - Fatal编程技术网

C++ 主控台上的巨大试捕挡块

C++ 主控台上的巨大试捕挡块,c++,exception-handling,main,C++,Exception Handling,Main,我有一个类可以在构造函数中抛出异常。我不知道自己拥有这个类的代码,所以我不能更改这个行为,也不能向这个类添加其他实例化或初始化方法。我需要在main中创建这个类的对象。这是否意味着我需要一个main(),它主要由一个巨大的try/catch块组成,如下所示: main() { try { A a; ... } catch(std::exception& e) { std::cout << e.what() << std:

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

main()
{
  try
  {
    A a;
    ...
  }
  catch(std::exception& e)
  {
    std::cout << e.what() << std::endl;
    return EXIT_FAILURE;
  }
  return EXIT_SUCCESS;
}
main()
{
尝试
{
A A;
...
}
捕获(标准::异常&e)
{
标准::cout
这是否意味着我需要一个main(),它主要由一个巨大的try/catch块组成


如果这条干管有几千行呢

不应该这样。不要这样。把你的功能转移到,嗯,功能上

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


如果这条干管有数千行长呢?
…我觉得应该有更好的方法,但我想不出一个

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

理想情况下,在
main()
中执行类似操作:

intmain(intargc,char*argv[]){
试一试{
应用程序应用程序(argc、argv);
app.run();
}
捕获(标准::异常&e){

std::cout如果您没有合理的方法来处理异常,那么就不要麻烦使用
try
块。只要让异常逃逸并关闭程序即可-另一种方法是在“世界”不处于正常状态时继续操作-这不是一个好主意。 当您没有合理的方法来处理错误时崩溃是合理的。只有当您有合理的方法来处理异常时,才应该捕获异常。默认情况下,让它们传播


如果您可以明智地处理异常,请在对象的实例化周围添加
try
块,然后在
catch
块中执行合理的错误处理。有几种不同的方法可以处理此异常

main()

就我个人而言,我只是在堆上而不是在堆栈上实例化类。这样,您就可以在实例化周围放置
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;
}
#包括
int main()
{
std::unique_ptr a;//或C++11之前的std::auto_ptr。。。
尝试
{
a、 重置(新a);
//或者,在C++14及更高版本中:
//a=std::使_唯一();
}
捕获(const std::exception&e)
{

std::cout“如果这个main有数千行长怎么办?”这将是您的问题,而不是try/catch块。围绕可能失败(否则是不可预防的)这种类型的代码使用try/catch块,而不是全部。您不需要依靠巨大的try/catch来处理项目中可能发生的任何错误,这也可能捕获意外异常。[main()返回int]main中的try-catch块是一种(几乎通用的)常见做法。“…数千行…”是邪恶的。即使一个人倾向于生成数千行长的函数,那又怎样?如果你有一个巨大的try/catch块,那又有什么关系呢?它并不需要额外键入。除非你手动键入所有缩进。main()中的代码行数与程序中的代码量几乎没有对应关系。您可以将main()重命名为其他名称,如main_inner(),然后从main()中的try块中调用main_inner()。将有兴趣发现downvoter不同意的地方。啊。我现在明白了。我需要做的是将所有内容封装到一个只有一个入口点的类中。在您有Application::run()的地方,我有大约1000行条件测试和函数调用。但是,将其全部放在“应用程序管理器”中类来理解需要做什么以及如何做,这正是我所需要的。这允许进行单个函数调用,并使main()保持小而简洁。谢谢!
try {
    // Refactored 1000 lines of code
}
catch(std::exception& e) {
    std::cout << e.what() << std::endl;
    return EXIT_FAILURE;
}
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;
}
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;
  }
}
#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;
}