代码之家  ›  专栏  ›  技术社区  ›  Head Geek

C++错误处理-示例代码的好来源?

  •  29
  • Head Geek  · 技术社区  · 17 年前

    几乎所有示例代码都忽略了错误处理(因为它“混淆了示例代码正在解决的问题”)。我的编程知识主要来自书籍和网站,在那里你几乎看不到任何错误处理,更不用说好的东西了。

    哪里有一些地方可以看到C++错误处理代码的好例子?特定的书籍、特定的开源项目(最好有文件和功能可以查看),以及特定的网页或网站都将被欣然接受。

    4 回复  |  直到 17 年前
        1
  •  44
  •   fhe    17 年前

    赫伯·萨特和安德烈·亚历山德雷斯库的书 C++ Coding Standards 有一整章关于 包括…在内

    • 自由断言以记录内部假设和不变量
    • 建立合理的错误处理策略,并严格遵守
    • 区分错误和非错误
    • 设计并编写错误安全代码
    • 按值抛出,按引用捕获
    • 适当地报告、处理和翻译错误
    • 避免异常规范

        2
  •  13
  •   gbjbaanb    12 年前

    “使用例外” vs。 “使用错误代码” 从来没有像例子所暗示的那样明确。

    “找不到文件” , “文件已锁定” ; 但千万不要把它扔给别人 “文件结束”

    如果您这样做,您就永远无法编写简单的循环,您将始终在异常处理程序中包装代码。不要忘记异常非常慢,这在大型多线程服务器中尤其重要。(在桌面应用程序中一点也不重要)。

    其次,对异常层次结构要非常小心。你可能认为有一个 Exception 类,然后派生一个 NetException 那就从它开始吧 SMTPException SMTPException 同学们,你们必须抓住它——只要你们能抓住它 例外 成员。解决这个问题的一个好办法是在基本异常类中有一个字符串和一个int成员,并且只使用它们,即使对于派生类型也是如此。不幸地 std::exception 仅提供一个字符串:(

    有些人说,这样做意味着您可能只有一个异常类型,特别是因为您始终会捕获基类类型。

    DoC 调用,并从中获取2个级别的异常 DoA . 除非指定特定于中代码的错误 ,你可能会认为它是从 DoB 要调试的rd。这尤其适用于OO程序)

    例外是好的,使用它们。但是想想你在做什么,不要滥用或过度使用它们。误用的异常比完全没有错误处理更糟糕(因为你可以抓取一个崩溃转储并查看未处理的异常以在几秒钟内找到错误。如果一个异常被吃掉并被忽略,你就被填满了)。

        4
  •  4
  •   Roddy    17 年前

    在C++中,无论如何,最终都应该使用不太明显的错误处理代码,因为您可以将大量重载留给异常。

    不要试图捕捉异常,除非您有一个特定的计划来处理它们。

    在C语言中,典型的错误处理场景如下所示:

    int DoA() 
    {
     if (location == hellInAHandcart)
      return ERROR;
     else
      RETURN OK;
    }
    
    int DoB()
    {
      int err = DoA();
      if (err != OK)
         return err;
      else
         return DoSomethingElse1();
    }
    
    int DoC()
    {
      int err = DoB();
      if (err != OK)
         //Handle My error here in whatever way...
    }
    

    void DoA() 
    {
     if (location == hellInAHandcart)
      throw Exception("Gone To Hell in a Handcart");
    }
    
    void DoB()
    {
      DoA();
      DoSomethingElse1();
    }
    
    void DoC()
    {
      try
      {
        DoB();
      }
      catch (Exception &E)
      {
        // Handle My error here in whatever way...
      }
    }