【问题标题】:exit() call inside a function which should return a reference在应该返回引用的函数内调用 exit()
【发布时间】:2014-05-15 14:37:52
【问题描述】:

在一个库中,我有一个函数可以在数据库中搜索一个键并返回一个对对象的非常量引用。我想处理没有找到密钥的情况,这通常是由于调用函数时出错引起的。这种情况非常糟糕,程序无法继续运行,所以我打印了一条消息以帮助发现错误并致电exit(1)。问题在于 return 语句在这种情况下永远不会执行,但无论如何都必须存在。如果它是一个指针,我可以return nullptr; 但有一个参考?我应该做这样的伪代码吗?

 Type & get(const Key & k) {
     if (my_db.key_exists(k)) {
       return my_db.at(k);
     }
     std::cerr << k << " not found\n";
     exit(1); 
     return *(new Type(some_dummy_parameters));
 }

看起来好可怕!也许我应该避免这样的功能。请告诉我你的意见!

【问题讨论】:

  • 你不需要 return 语句,因为你永远不会到达函数的末尾。 (不过,一些编译器可能会发出警告。)
  • @JamesKanze 是的,这完全是为了避免编译器警告。但由于收到大量建议,我现在正在考虑使用异常。即使它们没有被发现导致核心转储,它们看起来仍然是退出该功能的更好方法。
  • @DarioP 我并不反对其他 cmets。我倾向于在 C++ 中完全避免 exit(因为它不调用任何局部变量的析构函数),并将错误传播到 main,我可以从那里返回。
  • 您可能应该使用答案所示的异常。但是,从技术角度来看,您可以通过颠倒测试的意义来解决手头的问题。在 if 语句中使用 !my_db.key_exists(k)

标签: c++ reference return exit


【解决方案1】:

这种情况太糟糕了,程序无法继续,所以我打印了一条消息来帮助发现错误并调用 exit(1)

没有。如果此代码是库的一部分,则库不应决定应用程序是否应该退出。

如果一个文件打开并且需要关闭,或者需要清理一些其他资源,或者如果您的 DB 类的用户想要记录错误并继续执行其他操作,该怎么办?

答案是任何你现在正在做的事情。抛出异常、返回错误代码等,但不要在库或类代码中关闭应用程序。

信不信由你,有一个商业数据库库可以完成您正在做的事情(关闭应用程序)。他们从图书馆的用户那里得到了很多愤怒的回应,他们为什么要意外关闭应用程序。你知道吗 - 给客户的答案是“我们认为错误严重到足以停止应用程序,因为 我们的 库无法继续正常工作”。这不仅是错误的推理,而且近乎傲慢,客户让他们知道这一点。

【讨论】:

  • 我可以抛出异常,但我不能强迫用户捕捉它。如果出于某种原因他不这样做,这将成为核心转储。这比调用 exit() 更好吗?
  • 如果你清楚地记录了你的函数抛出了哪些异常,并且用户拒绝阅读文档并且没有执行 try/catch,那么如果他们的程序崩溃,那就是他们的问题,而不是你的问题。
  • 我喜欢这个答案,个人经历和轶事让你比人们说“做这个做那个”更有理由!
【解决方案2】:

例外情况

这是许多程序中的常见情况。为了克服这个问题,使用了异常。

  • 为了处理意外情况,会创建新的异常并从代码中“抛出”。
  • 然后它们必须被调用函数的程序“捕获”。

您可以阅读有关异常的更多信息here

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    正如其他受访者所说,答案应该是:抛出异常......

    Type & get(const Key & k) {
         if( !my_db.key_exists(k) ) {
              std::stringstream error;
              error << "key " << k << " not found";
              throw std::runtime_error(error);
         }
         return my_db.at(k);
    }
    

    【讨论】:

      【解决方案4】:

      库不应退出托管应用程序。

      使用“返回 null”,进入“不一致状态”,​​每次调用都返回 NULL。
      图书馆用户将不得不处理它。

      或例外...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-25
        • 2016-03-21
        • 2011-10-04
        • 2021-10-11
        • 1970-01-01
        • 1970-01-01
        • 2017-06-06
        • 1970-01-01
        相关资源
        最近更新 更多