异常处理 - 如果文件与原始文件存在,则用另一个文件名写入文件

时间:2013-12-14 11:04:51

标签: c++ exception exception-handling

当我尝试通过向文件名添加加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 (如果文件无法打开或存在但与我的文件等相同。)

如果文件名正确,我怎样才能尝试捕获文件名。或者有没有更简单的方法,我不应该使用例外?处理这个问题的最佳设计是什么?

2 个答案:

答案 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;
}