是否存在事故标准异常或最佳实践方式,通过异常发出“无效输入”信号?

时间:2016-08-24 23:21:25

标签: c++

invalid_argument是一个logic_error

reference sites表示

  

此类[i.e. logic_error]定义作为异常引发的对象类型,以报告程序内部逻辑中的错误,例如违反逻辑前置条件或类不变量。

     

在程序执行之前,可能会检测到这些错误。

问题:接受invalid_argument的语义严格绑定到“程序员的错误”,是否存在任何事实上的标准异常程序/库/ server可能用于将 ++ 运行时传递给外部主叫方“提供的输入无效”?
您的上一次体验是否在使用“invalid_input”类型的例外时显示出常规模式?
如果是这样,它是标准的还是每个人都只是根据需要得出它们的例外?

注意:

  1. 显然,stdexcept没有提供运行时语义。并且也没有提升

  2. 虽然我知道/遵循尽可能早的验证规则,但我发现了足够频繁的情况,其中输入数据(来自用户或非来自用户)只能在更深层的上下文中进行验证:as as - 尽可能早 - 可能需要匹配深层背景,而不是“在网关”。

  3. ++ “沟通”=在调用链中(或在堆栈跟踪的深处,如果您愿意的话),像

    这样的块
    // fwd declaration
    void function_facing_dirty_code(struct user_input& data);
    
    void function_facing_the_user(const char* jsonArgs) {
      try {
        struct user_input;
        parse_user_input(json_args, user_input);
        function_facing_dirty_code(user_input);
      }
      catch(invalid_input& ii) {
        // **this** should be a standard error for erroneous input/args/etc
        // treat it by telling the out-of-my-control caller to behave
      }
      catch (std::runtime_exception& e) {
        // tell the caller: sorry, you've done nothing wrong,
        // but I'm having generic runtime troubles.
      }
    }
    
    void function_facing_dirty_code(struct user_input& data) {
      try {
        // ... do some work
        // ... do some more work
        // Ahhh
        throw std::invalid_argument("Requested amount over the daily redraw limit");
        // ooops. This will cause a BSoD instead of telling the user.
        // Because std::invalid_argument is a logic error
      }
      catch(std::logic_error& bsod) {
        // log an error, blame the author, snitch it to his boss,
        // then generate a BSoD for the user's delight,
        // because she must NOT see our coding family's dirty laundry
      }
    }
    

1 个答案:

答案 0 :(得分:3)

std::logic_error和派生类背后的想法有点像一个美化的断言 - 在标准库中它们的用法有点像(想想vector::at - 你想要什么样的恢复?来自无效的矢量索引?它只是意味着逻辑是拙劣的,它只是UB的友好替代品);在invalid_argument中,std::bitset也使用了<stdexcept>这样的东西。

但我同意一般的&#34;无效的论点&#34;一种异常可以来自&#34;逻辑&#34;或者&#34;运行时&#34;错误;我的主要观点是:在没有任何东西的情况下,不要寻求更多的逻辑。

整个overflow看起来像是在吃饭之前作为事后的记录,然后完全忘了。极其广泛的错误类别被明确划分为这种逻辑/运行时二分法(有争议的价值),主要基于它们在标准库中如何用于所使用的那些;那些没有被使用的(这对程序员来说应该是方便的)在选择中是随机的(underflow / domain_error / out_of_range - 也许他们只是考虑数学函数?)和特征描述(overflow是&#34;逻辑&#34;但stdexcept是&#34;运行时&#34;?最多可辩论。

简而言之:不要忽视std::exception的想法 - 它们含糊不清,争议不休,然后才能满足标准库的某些需求。从std::runtime_error<table style="width: 90%" id="myTable" class="centered-table table table-bordered"> <thead> <tr> <th>Item*</th> <th>Qty*</th> <th>Price*</th> <th>Tax</th> <th>Action</th> </tr> </thead> <tbody> <tr> <td style="width: 60%"><input type="text" id="detail" name="detail[]"required></td> <td style="width: 8%"><input type="number" id="qty" name="qty[]" required></td> <td style="width: 12%"><input type="number" id="price" name="price[]" required></td> <input type="hidden" value="0" name="tax[]"> <td style="width: 5%"><input type="checkbox" id="tax" name="tax[]" value="1"></td> <td style="width: 12%"><div class="inline"><input type="button" id="addButton" class="btn btn-primary btn-xs" value="Add"/></div><div class="inline"><input type="button" id="deleteButton" class="btn btn-primary btn-xs" value="Delete"/></div> </tr> </tbody> 派生对您的应用程序有意义的异常层次结构,并对此感到满意。