C++ std::error_代码是发出警告的好方法吗?
我目前正在使用C++ std::error_代码是发出警告的好方法吗?,c++,c++11,system-error,C++,C++11,System Error,我目前正在使用std::error\u code在出现问题时向API用户提供反馈。添加类型为警告的std::error_condition来通知我的用户出现了一个小问题,但操作将继续,这在语义上是否可以接受?或者我应该只对此使用日志记录吗?对于库,有几个选项可以告诉用户发生了错误或与函数调用预期不符 例外情况。但是有异常开销,try/catch boost/std::可选。如果出现错误/警告,可以将其作为返回值(in/out或out参数)发出,否则可选值将为false std::pair/st
std::error\u code
在出现问题时向API用户提供反馈。添加类型为警告的std::error_condition
来通知我的用户出现了一个小问题,但操作将继续,这在语义上是否可以接受?或者我应该只对此使用日志记录吗?对于库,有几个选项可以告诉用户发生了错误或与函数调用预期不符
- 例外情况。但是有异常开销,try/catch
- boost/std::可选。如果出现错误/警告,可以将其作为返回值(in/out或out参数)发出,否则可选值将为false
- std::pair/std::tuple。这样,您可以在返回值中编码更多信息(尽管自定义结构也可以更明确地进行编码)
您可以引入自己的错误数据结构(不要使用std::error\u code
,因为它依赖于操作系统)
从库中删除应用程序也不是很实际。即使它是库中不可恢复的错误,也不必对实际调用的应用程序/进程/任何东西产生太大影响。让打电话的人决定做什么
但所有这些都不是普遍适用的。对于错误处理,没有一种适合所有人的解决方案。它可以非常特定于库的使用位置/方式/时间,因此您需要检查什么符合您的目的以及调用约束必须/应该有多强
在任何情况下,都要清楚调用方可以从错误处理中得到什么,不要让它感觉像火箭科学。最小设计在这里非常有用。如果我理解正确,您会问返回警告是否应该被视为滥用std::error\u code
语义
现在,标准引入了error\u code
,作为标准诊断库的一部分
<强> > [诊断]一般> <强>此条款描述C++程序可用于检测和报告错误条件的组件。
而且,据我所知,对什么是“错误条件”没有语义上的要求,我们可以假设这些是用来报告出了什么问题的,但它似乎没有强加部分满足操作规范的效果,操作应该告诉你
我看到的唯一语义要求是错误代码(和错误条件)是布尔可转换的,也就是说,“零”错误代码应该总是意味着成功
现在,假设您希望完成一个操作,警告被认为是成功的,出于这个原因<强>我不会认为通过错误代码< /强>返回这样的警告是有效的;
也就是说,您可能总是让您的操作返回两个错误代码(以您喜欢的方式,可能属于不同的类别),记录只有第一个报告操作效果的实现:
auto [err,war] = some_operation();
if(err) call_the police(); // some_operation failed
else if(war) // some_operation complains
{
std::cerr << "hold breath...";
if( war == some_error_condition )
thats_unacceptable();
//else ignore
}
auto[err,war]=some_operation();
如果(错误)打电话给警察某些操作失败
else if(war)//一些行动抱怨
{
如果抛出异常,则将异常处理委托给调用方,从而让调用方决定是错误还是警告。如果错误严重(不可恢复)而且操作无法继续,那么您应该只调用terminate
。我正在开发一个库。我认为调用terminate不是正确的方法。但这是处理不可恢复错误的唯一方法。我不会因为用户输入错误而杀死客户端应用程序。这没有任何意义。@TylerH(或任何人)这个问题的措词可能不是最佳的,但询问标准库设施的预期语义不是基于意见的……此外,它的优点是,当与“成功”结果代码一起使用时,暴露出标准规范中关于错误代码布尔转换含义的真正模糊性。错误代码是通过错误条件自我提升。这就是你看到的问题的解决方案否?很好的回答。是的,你返回错误代码,客户端与错误条件进行比较;唯一的例外是前面提到的布尔值含义…客户端根据条件进行检查,并相应地采取行动。如果条件错误,客户端处理失败,如果条件战争ning client may…log?不管怎样。No?我的意思是,您必须始终检查错误代码的条件。@Ruipacho这不是人们处理std::error\u code
的方式。代码通常检查是否使用运算符bool设置了错误,如果是,则认为操作失败。没有人会根据某些错误条件检查它e甚至可能不知道。@ruipacheco不,客户不能总是检查条件;他可以自由地检查布尔(err),并假设如果为真,则操作成功