C ++ 11从函数返回错误代码

时间:2013-05-29 15:55:23

标签: c++ c++11 error-handling

例如,我有一些Load()函数的类。

class DB {
private:
    pt_db *db;
public:
    DB(const char *path);
    Write(const char *path);
    int Load(const char *path);
};

我希望从Load()函数返回一些状态,具体取决于传递的参数。

例如:

Load(<correct path to the file with valid content>) // return 0 - success
Load(<non-existent path to file>) // return 1
Load(<correct file path, but the content of the file is wrong>) // return 2

然而我也担心:

  1. 类型安全 - 我的意思是我想返回一些只能用作状态代码的对象。

    int res = Load(<file path>);
    
    int other  = res * 2; // Should not be possible
    
  2. 仅使用预定义值。使用int我可以错误地返回其他一些状态,例如return 3(让我们在Load()函数中发现错误信息)以及我是否期望此错误代码将被传递:

    int res = Load(<file path>);
    
    if(res == 1) {}
    
    else if (res == 2) {};
    
    ...
    
    // Here I have that code fails by reason that Load() returned non-expected 3 value
    
  3. 使用最佳C ++ 11实践。

  4. 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

枚举是返回状态的好方法,例如:

class Fetcher{
public:
 enum FetchStatus{ NO_ERROR, INVALID_FILE_PATH, INVALID_FILE_FORMAT };
private:
 FetchInfo info;
public:
 FetchStatus fetch(){
    FetchStatus status = NO_ERROR;
    //fetch data given this->info
    //and update status accordingly
    return status;
 }
};

另一种方法是使用例外

class Fetcher{
private:
 FetchInfo info;
public:
 void fetch(){
    if file does not exist throw invalid file path exception
    else if file is badly formatted throw invalid file format exception
    else everything is good
}

使用枚举作为返回状态更多C方式,使用异常可能更多C ++方式,但它是一个选择问题。我喜欢enum版本,因为它的代码更少,而且在我看来更具可读性。