我有一个服务应用程序,它读取包含要打开的文件列表的配置文件。问题是当它在目录中找不到该文件时,它会抛出异常,从而取消该线程并停止服务应用程序。
这是在线程中调用的函数的代码块:
FILE* file_;
ServiceApp::File::File( const char* filename, const char* mode) :
file_(fopen(filename, mode))
{
if( !file_ )
{
// throwing will stop the service when file doesn't exist, what work around could we do?
throw std::runtime_error("file open failure");
}
问题: 我们如何防止这种情况发生,以便在目录中找不到配置文件中列出的文件时,应用程序会忽略它并继续该过程?
答案 0 :(得分:2)
我建议使用std::async
。如果函数抛出通过std::async
运行的函数,则异常将保存在std::future
中。当你致电std::future::get()
时,我会被重新开始。但是,如果您不这样做,它将被“忽略”,因此您的应用程序将继续运行。
示例:
auto lambda = [] {
throw std::runtime_error("error");
};
auto handle = std::async(std::launch::async, lambda);
有关std::async
的更多信息,请阅读this。
答案 1 :(得分:2)
最简单的方法是将try / catch语句放在处理文件的代码块周围。 您很可能在其他特殊情况下遇到其他异常情况(例如,在阅读阅读期间消失的网络文件时),因此请仔细检查代码以了解其他异常
答案 2 :(得分:1)
最简单的方法是在线程中尝试捕获自己的异常,然后检查它是那个异常(忽略它),如果是其他异常则重新抛出。
我不确定是否可以将信息添加到抛出的异常或遗留代码中?在后一种情况下,你将不得不求助于字符串比较,这当然是丑陋的。反正。
// pseudo-code
while(GotFilesInQueue())
{
try
{
LoadNextFile();
}
catch(std::exception& e)
{
if(!IgnoreExceptionPredicate(e))
{
throw;
}
}
}