●学校情報

講座一覧・募集状況

学習方法

学習サポート

修了生の評価

受講生の横顔

当学院について

入学相談

入学手続

 

●講座情報

技術者養成講座

プログラミング講座

WEB講座

情報処理試験講座

Excel講座

Access講座

 

●関連コラム

関連コラム

関連用語集

 

logo

 

 

関連用語集

C++の例外処理(Exception Handling)とは?try/catch/throwでエラーに強いプログラムを作ろう

プログラムを実行していると、予期せぬエラーが発生することがあります。 C++では、そうしたエラーに対応するために「例外処理(Exception Handling)」という仕組みが用意されています。

この記事では、try / catch / throw の基本的な使い方から、独自の例外クラス、注意点まで、初心者向けに解説します。

例外処理とは?

例外処理とは、エラーが発生したときに、通常の処理から分岐して安全に処理を続行または終了するための仕組みです。 C++では主に以下の3つのキーワードを使って行います。

  • try:例外が発生するかもしれない処理を囲む
  • throw:例外を発生させる
  • catch:発生した例外を受け取り処理する

基本構文と例

#include <iostream>
using namespace std;

int divide(int a, int b) {
    if (b == 0) {
        throw "ゼロ除算エラー";
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0);
        cout << "結果: " << result << endl;
    } catch (const char* msg) {
        cout << "例外発生: " << msg << endl;
    }
    return 0;
}

この例では、0で割ろうとしたときに throw で例外を発生させ、それを catch が受け取って処理しています。

複数のcatchを使う

C++では、型ごとに異なるcatch文を記述できます。

try {
    // 処理
} catch (int e) {
    cout << "整数の例外: " << e << endl;
} catch (const char* msg) {
    cout << "文字列の例外: " << msg << endl;
}

catch(...) で全ての例外を受け取る

try {
    // 処理
} catch (...) {
    cout << "不明な例外を捕捉" << endl;
}

catch(...) は、型に関係なくあらゆる例外を捕捉するための文法です。

標準の例外クラス

C++では <stdexcept> ヘッダに標準の例外クラスが用意されています。

  • std::runtime_error
  • std::out_of_range
  • std::invalid_argument
  • std::logic_error など
#include <stdexcept>

throw std::runtime_error("実行時エラーです");

独自の例外クラスを作る

独自の例外を作るには、std::exception を継承したクラスを作成します。

#include <exception>

class MyException : public std::exception {
public:
    const char* what() const noexcept override {
        return "独自の例外が発生しました";
    }
};

int main() {
    try {
        throw MyException();
    } catch (const MyException& e) {
        cout << e.what() << endl;
    }
}

例外処理のメリット

  1. 異常な動作を安全に分離できる
  2. エラー発生箇所と処理箇所を分けて記述できる
  3. ライブラリや関数内で発生したエラーを伝播できる

注意点

  • パフォーマンスに影響するため、頻繁な例外使用は避ける
  • 例外が補足されないとプログラムが異常終了する
  • 例外処理の設計は過不足のない粒度で行うことが重要

まとめ

C++の例外処理は、予期せぬエラーを安全に処理するための重要な仕組みです。 try / throw / catch の基本を押さえれば、より堅牢なコードが書けるようになります。

まずは基本の構文でゼロ除算や範囲外アクセスなどを扱いながら、std::exceptionや独自例外クラスの活用へとステップアップしていきましょう!

 

C++関連用語集

−−−−−  C++  −−−−−

C++のクラス(Class)とは?仕組みと使い方をわかりやすく解説!

C++のオブジェクト(Object)とは?クラスとの関係と役割をわかりやすく解説!

C++のコンストラクタ(Constructor)とは?役割と使い方をやさしく解説!

C++のデストラクタ(Destructor)とは?役割と使い方をやさしく解説!

C++の継承(Inheritance)とは?クラスを拡張する基本テクニック

C++の多態性/ポリモーフィズム(Polymorphism)とは?オブジェクト指向の真髄を解説!

C++のオーバーロード(Overload)とは?関数や演算子を便利に使い分けよう!

C++のオーバーライド(Override)とは?継承と仮想関数の正しい使い方

C++の仮想関数(Virtual Function)とは?ポリモーフィズムを実現する仕組みを解説!

C++の純粋仮想関数(Pure Virtual Function)とは?抽象クラスとの関係も解説!

C++の抽象クラス(Abstract Class)とは?使い方と役割をわかりやすく解説!

C++のテンプレート(Template)とは?型に依存しない汎用的な関数・クラスを作ろう!

C++の名前空間(Namespace)とは?名前の衝突を防ぐ便利な機能

C++の標準テンプレートライブラリ(STL)とは?効率的な開発に必須のライブラリ群

C++のベクター(vector)とは?配列より便利なSTLコンテナを使いこなそう!

C++のイテレータ(Iterator)とは?STLコンテナを自在に操作する鍵

C++の参照(Reference)とは?ポインタとの違いもわかりやすく解説!

C++のポインタ(Pointer)とは?メモリを操る強力な機能をやさしく解説!

C++の動的メモリ確保(Dynamic Memory Allocation)とは?newとdeleteを使いこなそう

C++のnew/delete演算子とは?動的メモリ確保の基本をマスターしよう!

C++の例外処理(Exception Handling)とは?try/catch/throwでエラーに強いプログラムを作ろう

C++のtry/catch構文とは?例外処理の基本をやさしく解説!

C++のRAIIとは?リソース管理を自動化する重要な設計原則

C++の静的変数(static variable)とは?使い方・特徴・注意点をやさしく解説!

C++の関数ポインタ(Function Pointer)とは?使い方と活用例をわかりやすく解説!

C++のラムダ式(Lambda Expression)とは?書き方・使い方をやさしく解説!

C++のスマートポインタ(Smart Pointer)とは?自動で安全なメモリ管理を実現しよう!

C++のコンパイル(Compile)とは?仕組みと流れをわかりやすく解説!

C++のリンク(Link)とは?コンパイルとの違いとエラー対策を解説!

C++のプリプロセッサディレクティブとは?#include や #define の意味と使い方