カスタム例外型
独自の例外を定義します
「カスタム例外型」は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フィードバックを取得できます。ローカル設定は不要です。