我有一个 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 block 中调用 Ptr f(path) 时,您正在创建一个名为 f 的全新变量,该变量将在您退出 try block 时被销毁。
然后任何在 try block 之外使用 f 的代码都将使用您在开始时创建的未初始化的 F。
我可以看到您有 2 个选项:
添加一个 Open 方法或类似于 Ptr 的方法并从 try block 中调用它,或者可能将所有文件读取/写入代码包装在 try block 中,这样您就可以避免返回 false 的需要,因为所有代码抛出异常时将被跳过。
选项 1:
Ptr f;
try
{
f.Open( file );
}
catch
....
选项 2:
try
{
Ptr f( file );
f.read();
}
catch
.....
关于c++ - 为什么在 try block 中初始化文件指针会导致管道损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8136475/