HiroLab

プログラミングに関する情報発信サイト。

C++

【C++】Day 17:例外安全性とエラーハンドリング

投稿日:

Day 17では、例外安全性とエラーハンドリングについて学習します。

C++では、プログラムが例外(予期しないエラー状態)に遭遇した際に、そのエラーを適切に処理することが重要です。例外安全性は、プログラムが例外が発生しても、リソースリークやデータ破損を防ぐための考慮と設計のことを指します。エラーハンドリングは、例外をキャッチし、適切に処理することを指します。

以下にそれぞれの内容を詳細に説明し、例題と演習問題を提示します。

 

例外安全性:

1. 強い例外安全保証:
– 関数が例外を送出した場合でも、関数が呼び出される前の状態に戻すことが保証される状態を指します。

 

2. 基本的例外安全保証:
– メモリリークはなく、データ破損もないことが保証される状態を指しますが、関数が呼び出される前の状態に戻すことは保証されません。

 

3. 弱い例外安全保証:
– メモリリークやデータ破損はないが、関数が例外を送出した場合、関数が呼び出される前の状態に戻ることは保証されません。

 

エラーハンドリング:

1. try-catchブロック:
– `try` ブロック内で例外が発生する可能性のあるコードを記述し、`catch` ブロックで例外をキャッチして適切な処理を行います。

 

2. 例外の種類:
– C++では、`std::exception` クラスを継承したカスタム例外クラスを定義することで、異なる例外の種類を作成できます。

 

例題:

#include <iostream>
#include <stdexcept>

// 例外を送出する関数
void divide(int a, int b) {
if (b == 0) {
throw std::runtime_error("Divide by zero.");
}
int result = a / b;
std::cout << "Result: " << result << std::endl;
}

int main() {
try {
// 例外を送出する関数を呼び出し
divide(10, 2);
divide(5, 0); // ゼロで割り算を試みる
} catch (const std::exception& e) {
// 例外をキャッチしてエラーメッセージを表示
std::cerr << "Exception caught: " << e.what() << std::endl;
}

return 0;
}

 

演習問題:

1. ユーザーに2つの整数を入力してもらい、それらの整数を割り算して表示するプログラムを作成してください。ただし、ゼロで割る場合には `std::runtime_error` 例外を送出し、それを適切にキャッチしてエラーメッセージを表示してください。

2. クラス `MyVector` を定義してください。このクラスは可変長の整数の配列を持ち、要素を追加するメソッド `add` と指定したインデックスの要素を取得するメソッド `get` を持ちます。ただし、インデックスが範囲外の場合には `std::out_of_range` 例外を送出してください。

これらの例題と演習問題を解くことで、例外安全性とエラーハンドリングの重要性を理解し、プログラムの信頼性と安全性を向上させることができます。問題を解いたら、例外が適切に処理されているかどうかを確認してみてください。

-C++
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

【C++】Day 5:制御文の一つであるループについて

Day 5では、制御文の一つであるループについて学習します。 ループは、特定の処理を繰り返し実行するための構文です。C++には主に3種類のループがあります:forループ、whileループ、do-whi …

【C++】Day 26:デザインパターン「作成型パターン」

Day 26では、デザインパターンのうち「作成型パターン」について学習します。 作成型パターンは、オブジェクトのインスタンスを生成する方法に関するパターンです。主な作成型パターンには、シングルトン、フ …

【C++】Day 3:C++の演算子について

Day 3では、C++の演算子について学習します。 演算子はプログラム内で値を操作するための特殊な記号やキーワードです。 C++には様々な演算子が存在し、数値演算、論理演算、代入演算などがあります。以 …

【C++】Day 14:C++における文字列操作

Day 14では、C++における文字列操作について学習します。 C++では標準ライブラリである`<string>`を使用して、文字列を操作することができます。 以下に文字列操作の主な内容と …

【C++】Day 22:ネットワークプログラミングにおけるソケットとプロトコル

Day 22では、ネットワークプログラミングにおけるソケットとプロトコルについて学習します。 ソケットは、ネットワーク通信を行うためのプログラムインターフェースであり、プロトコルは通信のルールや方法を …