如何从非远外例外减少调试开销

How can I reduce the debugging overhead from non-exceptional exceptions

本文关键字:调试 开销      更新时间:2023-10-16

我们使用的API在很大程度上依赖于返回非检查结果的例外。一个例子(在许多人中)是要确定用户是否在一组人中,我们必须尝试获取小组并解释结果"无组"例外。此外,所有这些异常都是一种类型。

我们正在使用大量多线程的C 11进行大型且复杂的项目,此外,我们正在研究关注网络通信的领域,因此我们必须同时调试多个实例。

我们的问题,因此我的问题的基础是由于非检查异常对我们的工作流程的影响。我们不愿意关闭API投掷的单个异常类型的第一次算法例外报告,因为这意味着如果我们呼叫API,编码器错过了尝试/捕获块的API,我们将放松一下主要和失去了通话的上下文。如果我们对例外情况下的例外,那么简单的非远外行为(例如上面示例中描述的行为)可能会导致多次休息(初始投掷和可能是一些重新介绍),我们只能验证这实际上是非 - 通过查询堆栈(通常是非序列线)来查找引起异常的API调用。

我相信我们的用例并不独特,以至于其他人不会遇到相同的工作流问题,因此我的问题是我们应该如何更改调试过程,以更好地应对不受欢迎的例外问题,如上所述。

我们目前仅限于使用Visual Studio(或潜在的WindBG)进行调试。

在非优先用例中抛出异常是完全错误的IMO。下一步:每个功能都是void,通过抛出异常,一切都会返回。

据我了解,

您使用的是第三部分API,该API显示了这种奇怪的行为。这是我通常在处理任何类型的"奇数API"时考虑的内容,包括用愚蠢的宏来污染所有内容的C-

  1. 尝试避免行为奇怪的部分。在您的情况下:如果您可以打电话,请进行拨打,即致电if(hasGroup) getGroup; else ...而不是try {getGroup;} catch(X) {...}
  2. ,而不是通过编写包装器API来限制所有代码中的奇数涟漪。在您的情况下:写一个捕获异常并以正常返回值转换的包装器。这样,您的编码器就不会忘记捕获正常的案例外观(因为您的包装器不会抛出它们),如果将包装器放入其自己的库中,则可以在包装器API中使用另一个异常策略。GetGroup问题的快速示例:

    //myAPIWrapper.h
    namespace myAPIWrapper {
      class Group;
      class User {
      public:
        boost::optional<Group> getGroup();
      };
    }
    
    //myAPIWrapper.cpp
    #include "OddAPI.h"
    namespace myAPIWrapper {
      boost::optional<Group> User::getGroup()
      {
        boost::optional<Group> theGroup;
        try {
          oddAPI::user& oddUser= unwrap(*this);
          oddAPI::group& oddGroup = oddUser.get_group();
          theGroup = wrap(oddGroup);
        }
        catch(oddAPI::exception&) {
        }
        return theGroup;
      }
    }