Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::error_代码是发出警告的好方法吗?_C++_C++11_System Error - Fatal编程技术网

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),并假设如果为真,则操作成功