当我尝试通过向文件名添加加ID来编写已存在的文件时,我尝试处理这些情况。简而言之,它就像Windows复制文件时所做的那样。
假设我有一个文件 test.bmp 。我想对其应用过滤器并将过滤后的图像保存为 testout.bmp 。但 testout.bmp 已存在于该文件夹中,因此程序会捕获此内容并将其另存为 testout(1).bmp 。在我的代码中,我尝试使用exeptions。我的想法是这样的:(伪代码)
bool IMAGE_DATA::openFile(const char* filename)
{
int i = 0;
try
{
if(file_exists(filename)) throw whatever;
}
catch(type whatever)
{
changefilename(filename,i)
i++;
if(file_exists(filename)) /* throw whatever/do something */;
}
};
目前,如果文件已经存在,我的程序只存在(当文件夹中有一个带有该名称的文件时,file_exists只返回true。)
我开始使用异常处理重新设计我的基本函数,而不是在发生任何错误时返回false。我在这里写了无论什么,因为我会有更多 throws (如果文件无法打开或存在但与我的文件等相同。)
如果文件名正确,我怎样才能尝试和捕获文件名。或者有没有更简单的方法,我不应该使用例外?处理这个问题的最佳设计是什么?
答案 0 :(得分:2)
我无法理解为什么要使用例外。除了一些非常具体的习语之外,流量控制的例外被认为是非常糟糕的风格。抛出和捕获任何不是从std :: exception派生的东西也是禁忌。另外,您发布的代码甚至不接近编译,所以我的答案也是伪代码。还有一件事,为什么要使用char *作为名称而不是std :: string?
这会做你需要的吗?
bool IMAGE_DATA::openFile(std::string filename)
{
while(file_exists(filename))
{
filename = add_1_to_filename(filename);
}
open(filename);
}
答案 1 :(得分:1)
在您的方案中,拥有现有文件也不例外。因此,不要使用它们。 如果您尝试传递其他信息,可以使用仿函数:
#include <iostream>
struct FileExits {
bool value;
std::string information;
FileExits(const std::string& name)
: value(true), information("Test")
{}
operator bool () const { return value; }
};
int main() {
// Endless loop in this example
std::string name;
while(FileExits result = name) {
std::cout << result.information << std::endl;
}
// ...
return 0;
}