我有一个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
发生了什么事?
答案 0 :(得分:3)
当你在try块中调用Ptr f(path)时,你正在创建一个名为f的全新变量,当你退出try块时它将被销毁。
然后任何使用f覆盖try块的代码都将使用你在开始时创建的未初始化的F.
我可以看到两个选项:
添加一个Open方法或类似于Ptr并从try块中调用它,或者可能将所有文件读/写代码包装在try块中,这样就可以避免返回false的需要,就像所有代码一样抛出异常时会被跳过。
选项1:
Ptr f;
try
{
f.Open( file );
}
catch
....
选项2:
try
{
Ptr f( file );
f.read();
}
catch
.....
答案 1 :(得分:1)
它可能是一个范围问题,用以下代替:
bool getResult(const char* path)
{
try
{
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;
}
...
}
catch(Exception& e)
{
vlog.error("Could not open file at %s",path);
return false;
}
return true;
}