0Pricing
C++ Academy · レッスン

カスタム例外型

独自の例外を定義します

「カスタム例外型」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

カスタム例外が必要な理由

独自の例外型を定義すると、呼び出し側で独自のエラーを具体的に捕捉でき、エラーにドメイン固有のデータを持たせることもできます。

std::exception を継承する

std::exception(またはそのサブクラス)を基底クラスにして、標準のハンドラと統合し、what()を公開できるようにしてください。

#include <exception>
#include <string>

class ConfigError : public std::exception {
    std::string msg;
public:
    explicit ConfigError(std::string m) : msg(std::move(m)) {}
    const char* what() const noexcept override { return msg.c_str(); }
};

throw と catch

独自の型も他の例外と同じように扱えます。throwし、参照でcatchしてください。

#include <iostream>
#include <exception>
#include <string>

class ConfigError : public std::exception {
    std::string msg;
public:
    explicit ConfigError(std::string m) : msg(std::move(m)) {}
    const char* what() const noexcept override { return msg.c_str(); }
};

int main() {
    try {
        throw ConfigError("missing key");
    } catch (const ConfigError& e) {
        std::cout << e.what() << "\n";
    }
}

標準の基底クラスを再利用する

多くの場合、std::runtime_errorやstd::logic_errorから継承できます。これらはすでにメッセージを保持するため、定型コードを減らせます。

#include <stdexcept>
#include <string>

class NetworkError : public std::runtime_error {
public:
    explicit NetworkError(const std::string& m) : std::runtime_error(m) {}
};

追加データを持たせる

カスタム例外には、エラーコードや問題のある値などのフィールドを持たせ、ハンドラにより多くのコンテキストを提供できます。

#include <stdexcept>
#include <string>

class HttpError : public std::runtime_error {
public:
    int status;
    HttpError(int s, const std::string& m)
        : std::runtime_error(m), status(s) {}
};

基底クラスで捕捉する

独自の型はstd::exceptionを継承しているため、汎用ハンドラでも基底クラスへの参照を通じて捕捉できます。

#include <iostream>
#include <stdexcept>

class HttpError : public std::runtime_error {
public:
    int status;
    HttpError(int s, const std::string& m) : std::runtime_error(m), status(s) {}
};

int main() {
    try {
        throw HttpError(404, "not found");
    } catch (const std::exception& e) {
        std::cout << e.what() << "\n";
    }
}

例外の階層を構築する

関連するエラーを共通の基底クラスの下にまとめると、呼び出し側で一連の例外全体を捕捉することも、特定の型だけを捕捉することもできます。

#include <stdexcept>

struct AppError : std::runtime_error { using std::runtime_error::runtime_error; };
struct DbError  : AppError       { using AppError::AppError; };
struct AuthError: AppError       { using AppError::AppError; };

what() を noexcept に保つ

what()はconst noexceptとしてオーバーライドし、安定したバッファを返してください。例外を発生させたり、ダングリングポインタを返したりしてはいけません。

値でthrowする

例外オブジェクトは値でthrowしてください(例:throw HttpError(500, "x");)。巻き戻し中の記憶領域はランタイムが管理します。

throw する例外を文書化する

APIの例外型を契約の一部として明記し、呼び出し側がどのようなcatchを書くべきか分かるようにしてください。

シンプルに保つ

ほとんどのプロジェクトで必要な例外型は、少数に限られます。std::runtime_errorから継承すれば、大半のケースを簡潔に扱えます。

クイックチェック

カスタム例外の理解度を確認しましょう。

まとめ

std::exceptionまたはstd::runtime_errorから継承してカスタム例外型を定義し、追加データを持たせ、階層を構築し、what()をnoexceptに保ち、値でthrowする方法を学びました。例外型は少数に絞り、文書化してください。

よくある質問

「カスタム例外型」レッスンは無料ですか?

はい。「カスタム例外型」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「カスタム例外型」で何を学びますか?

独自の例外を定義します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「カスタム例外型」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. try、catch、throw
  2. 例外安全性
  3. noexcept指定子
  4. カスタム例外型
← C++ Academyに戻る