invalid_argument
是一个logic_error
。
此类
[i.e. logic_error]
定义作为异常引发的对象类型,以报告程序内部逻辑中的错误,例如违反逻辑前置条件或类不变量。在程序执行之前,可能会检测到这些错误。
问题:接受invalid_argument
的语义严格绑定到“程序员的错误”,是否存在任何事实上的标准异常程序/库/ server可能用于将 ++ 运行时传递给外部主叫方“提供的输入无效”?
您的上一次体验是否在使用“invalid_input”类型的例外时显示出常规模式?
如果是这样,它是标准的还是每个人都只是根据需要得出它们的例外?
注意:
显然,stdexcept
没有提供运行时语义。并且也没有提升
虽然我知道/遵循尽可能早的验证规则,但我发现了足够频繁的情况,其中输入数据(来自用户或非来自用户)只能在更深层的上下文中进行验证:as as - 尽可能早 - 可能需要匹配深层背景,而不是“在网关”。
++ “沟通”=在调用链中(或在堆栈跟踪的深处,如果您愿意的话),像
这样的块// 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
}
}
答案 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>
派生对您的应用程序有意义的异常层次结构,并对此感到满意。