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 28:デザインパターン「行動型パターン」

Day 28では、デザインパターンのうち「行動型パターン」について学習します。 行動型パターンは、オブジェクト間の相互作用や責任の分担に関するパターンです。主な行動型パターンには、ストラテジ、オブザー …

【C++】Day 6:関数について

Day 6では、関数について学習します。 関数は、プログラム内で特定のタスクを実行するために使用されるブロック(サブルーチン)です。関数はメインプログラムから呼び出すことができ、再利用性とコードの構造 …

【C++】Day 25:パフォーマンスと最適化

Day 25では、パフォーマンスと最適化について学習します。 プログラムのパフォーマンスは、実行速度やメモリ使用量などの面での良し悪しを指します。最適化は、プログラムのパフォーマンスを向上させるために …

【C++】Day 11:「ファイル入出力」と「例外処理」

Day 11のトピックとして、「ファイル入出力」と「例外処理」について学習します。   ファイル入出力: 1. ファイル入出力の概要: – ファイル入出力は、プログラムと外部のフ …

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

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