8

我的构造函数中有以下代码块(这只是一个示例,问题不是关于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
4

2 回答 2

12

请检查这个答案。这解释了如何使用你自己的异常类

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");
于 2012-07-24T16:44:03.247 回答
6

您的用法strtok不正确-它需要 achar*因为它修改了字符串,但不允许修改 a.c_str()上的结果 a std::string。需要使用 C 风格的演员表(这里表现得像 a const_cast)是一个很大的警告。

您可以通过使用 boost 文件系统巧妙地避开这个和路径分隔符可移植性的东西,这很可能会在 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";
  }
}

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

于 2012-07-24T16:43:36.130 回答