std::stoi() が投げる例外

C++11 で <string> に std::stoi() 等の std::string を数値型に変換する関数が追加されました。

便利な関数であるのですが、「投げ得る例外が2種類ある」という点はやや意外ですので、注意が必要です。
#include <iostream>
#include <string>

int main(void)
{
    // 正常に整数を取得
    int i = std::stoi("123");
    std::cout << i; // => "123"

    // 文字列から整数を取得できない
    // std::stoi() からstd::invalid_argumentが投げられる
    try {
        std::cout << std::stoi("abc");
    }
    catch (const std::invalid_argument& e) {
        std::cout << "invalid_argument"; // => "invalid_argument"
    }

    // 整数を取得できるが、intに入り切らない
    // std::stoi() からstd::out_of_rangeが投げられる
    try {
        std::cout << std::stoi("9999999999");
    }
    catch (const std::out_of_range& e) {
        std::cout << "out_of_range"; // => "out_of_range"
    }
}
個人的には、例外送出が2種類あるというのは仕様として良くないと思います。
std::out_of_range は止めて std::invalid_argument 一本に絞った方が良かったと思います。

0 件のコメント:

コメントを投稿