Как включить целое число в строку? - PullRequest
2 голосов
/ 03 декабря 2011

В случае сбоя системного вызова я хотел бы выдать исключение, содержащее «errno», относящееся к ошибке.Прямо сейчас я использую это:

if (bind(...) == -1) {
   std::stringstream s;
   s << "Error:" << errno << " during bind";
   throw std::runtime_error(s.str());
}

Это кажется неуклюжим.Я не могу напрямую добавить целое число в std :: string () - что является лучшим решением для этого?В Java есть String (). Append (int), но в std :: string такой возможности нет.Все ли для этого пишут обертку вокруг std :: string?

Ответы [ 3 ]

3 голосов
/ 03 декабря 2011

Мне нравится использовать boost::format для этого.

std::string msg = boost::str( boost::format("Error: %1% during bind") % errno );
throw std::runtime_error(msg);

Одно предостережение: если у вас есть bad_alloc в блоке перехвата, вы можете скрыть предыдущую ошибку. Насколько я знаю, boost::format использует распределение, поэтому оно может пострадать от этого. Вы не ловите здесь, так что это не совсем применимо. Это то, что нужно учитывать при обработке ошибок.

3 голосов
/ 03 декабря 2011

boost::lexical_cast полезно в этом сценарии:

throw std::runtime_error("Error:" + boost::lexical_cast<std::string>(errno) + " during bind");
2 голосов
/ 03 декабря 2011

Вы можете написать свой собственный:

Вот несколько подсказок:

class Exception{
public:
    Exception(const char* sourceFile, const char* sourceFunction, int sourceLine, Type type, const char* info = 0, ...);
protected:
    const char *mSourceFile;
    const char *mSourceFunction;
    int mSourceLine;
    Type mType;
    char mInfo[2048];
};

Где тип может быть:

enum Type
{
    UNSPECIFIED_ERROR,              //! Error cause unspecified.
    .. other types of error...  
};

Таким образом, вы можете передать строку в обычном формате .. например

Exception(__FILE__, __FUNCTION__, __LINE__, Type::UNSPECIFIED_ERROR, "Error %d", myInt);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...