我有一个bash脚本,正在从程序中读取结果。 Ptr是一个简单的popen()包装器。

bool getResult(const char* path){
  Ptr f(path);
  char buf[1024];
  while (fgets(buf, sizeof(buf), f) == 0) {
    if(errno == EINTR)
      continue;
    log.error("Error (%d) : %s",errno,path);
    return false;
  }
  ...
  return true;
}

这可以正常工作,但是Ptr f(path)并非异常安全,因此我将其替换为:
Ptr f; // empty constructor, does nothing
char buf[1024];
try{
  Ptr f(path);
}catch(Exception& e){
  vlog.error("Could not open file at %s",path);
  return false;
}

运行时(文件存在),出现以下错误:
/etc/my_script: line 165: echo: write error: Broken pipe

脚本的这一行就是:
echo $result

到底是怎么回事?

最佳答案

当您在try块中调用Ptr f(path)时,您正在创建一个名为f的新变量,当退出try块时该变量将被销毁。

然后,任何使用f outsidde try块的代码都将使用您在开始时创建的未初始化F。

我有两种选择:

添加一个Open方法或类似于Ptr的方法,然后在try块中调用它,或者将所有文件的读取/写入代码都包装在try块中,这样就可以避免返回false的麻烦,因为所有代码都已经引发异常时跳过。

选项1:

Ptr f;
try
{
    f.Open( file );
}
catch
....

选项2:
try
{
    Ptr f( file );
    f.read();
}
catch
.....

10-07 17:56