Help us understand the problem. What is going on with this article?

C++の例外クラスの自作

More than 1 year has passed since last update.

はじめに

例外の差異に例外クラスを使ってthrowする必要を感じたので,どうしたら良いか調べようと思っても中々思ってる情報が出てこないので書きました.
C++はほぼ全くの初心者です.Better Cとして使ってます.
間違い等があればご指摘いただけると幸いです.

意味

  • throw "hogehoge";とするのは簡単だが,受け取った側は「あ,なんか例外来た.ユーザーに表示して終了しよう」くらいしかできない.
  • あるいは握りつぶすか,タイミングで推測するか
  • 受け取り側のプログラムにエラーの内容がわかるように例外を投げる→例外クラスを使う

作り方

コメントにて指摘があったので追記

  • std::exceptionを継承するか,あるいはstd::runtime_errorを継承する
  • そうすることで,std::exceptionをcatchすることでまとめて捕まえることができて便利.(握りつぶしたいときとか,とりあえず全部キャッチしたいときとか)
  • std::exceptionはそのままではメッセージくらいしか出せない.e.what()で読める. → これはMSの独自仕様らしい.std::runtime_errorなどは標準の仕様でメッセージが出せる.
  • デバッグする人間のためにe.what()で概要をつかめるようにすべき
  • 追加のデータ構造は自分で持たせる
    class PCSCCommandException : public std::runtime_error
    {
    public:     //元々std::runtime_errorにある文字列↓   ↓追加の情報
        PCSCCommandException(const char *_Message, int res)
            : _Errinfo(res), runtime_error(_Message)
                                      //↑こうすることでwhat()で人間向けメッセージが読める
        {}

           //↓追加のエラー情報を返すGetter
        int returncode()
        {
            return _Errinfo;
        }
    private:
        int _Errinfo;
    };
  • 本来こういうのは良くないのかもしれないが,自分は詳細なエラー情報を別途持たせたりしている.
    class PCSCStateException : public std::runtime_error
    {
    public:
        enum
        {
            FAILD_TO_ESTABLISH,
            NOT_CONNECTED_TO_SERVICE,
            NOT_CONNECTED_TO_READER,
            NOT_CONNECTED_TO_CARD,
            NO_READERS_AVAILABLE,
            FAILED_TO_DETECT_READER,
            FAILED_TO_GET_CARD_STATUS,
            READER_DISCONNECTED,
            UNKNOWN_STATUS,
            NO_CARD_FOUND,
            UNKNOWN_ERROR,
            FAILED_TO_DIRECT_CONNECTION,
            CARD_REMOVED,
        };

        PCSCStateException(const char *_Message, int errorcode, LONG ret)
            : _Errinfo(), runtime_error(_Message)
        {
            _Errinfo.errorcode = errorcode;
            _Errinfo.ret = ret;
        }

        int errorcode()
        {
            return _Errinfo.errorcode;
        }
        LONG returncode()
        {
            return _Errinfo.ret;
        }
    private:
        struct PCSCStateError_struct
        {
            int errorcode;
            LONG ret;
        };

        PCSCStateError_struct _Errinfo;
    };

gpsnmeajp
電子工作が主な趣味ですが、PC用のツールを作るのも好きです。 特にライセンスを明記していないソースコードのライセンスについてはCC0です。
https://sabowl.sakura.ne.jp/gpsnmeajp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした