抛出异常的一般原因c ++

时间:2012-07-24 16:28:03

标签: c++

我的构造函数中有以下代码块(这只是一个示例,问题不是关于split,而是关于抛出一般异常。此外, Boost 库。

Transfer::Transfer(const string &dest){
  try{
    struct stat st;
    char * token;
    std::string path(PATH_SEPARATOR) // if it is \ or / this macro will solve it
    token = strtok((char*)dest.c_str(), PATH_SEPARATOR) // 
    while(token != NULL){
        path += token;
        if(stat(path.c_str(), &st) != 0){
            if(mkdir(path.c_str()) != 0){
                 std:string msg("Error creating the directory\n");
                 throw exception // here is where this question lies
            }
        }

        token = strtok(NULL, PATH_SEPARATOR);
        path += PATH_SEPARATOR;

    }
  }catch(std::exception &e){
       //catch an exception which kills the program
       // the program shall not continue working.
  }

}

如果目录不存在且无法创建,我想要的是抛出异常。我想抛出一个通用异常,我怎么能在C++中做到这一点? PS:dest具有以下格式:

dest = /usr/var/temp/current/tree

2 个答案:

答案 0 :(得分:10)

请检查this answer。这解释了如何使用自己的异常类

class myException: public std::runtime_error
{
    public:
        myException(std::string const& msg):
            std::runtime_error(msg)
        {}
};

void Transfer(){
  try{
          throw myException("Error creating the directory\n");
  }catch(std::exception &e){
      cout << "Exception " << e.what() << endl;
       //catch an exception which kills the program
       // the program shall not continue working.
  }

}

此外,如果您不想要自己的课程,可以通过

完成
 throw std::runtime_error("Error creating the directory\n");

答案 1 :(得分:6)

您的usage of strtok is incorrect - 它需要char*,因为它会修改字符串,但不允许修改.c_str()std::string的结果。需要使用C样式转换(这里的表现类似于const_cast)是一个很大的警告。

你可以通过使用boost文件系统巧妙地回避这个和路径分离器的可移植性,只要发布它就是likely to appear in TR2。例如:

#include <iostream>
#include <boost/filesystem.hpp>

int main() {
  boost::filesystem::path path ("/tmp/foo/bar/test");
  try {
    boost::filesystem::create_directories(path);
  }
  catch (const boost::filesystem::filesystem_error& ex) {
    std::cout << "Ooops\n";
  }
}

拆分平台分隔符上的路径,根据需要创建目录,如果失败则抛出异常。