'try' と 'catch' ブロック
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部 — レッスン 49/56。
try ブロックと catch ブロックは連携して、コードのセーフティネットを作成します。リスクのある可能性のあるコードを try ブロックの中に配置し、例外が発生した場合、プログラムは対応する catch ブロックにジャンプして、エラーを適切に処理します。
基本的な構文構造は次のようになります:
try {
// 例外をスローする可能性のあるコード
} catch (exception_type e) {
// 例外を処理するコード
}実用的な例として、std::stoi を使用して文字列を数値に変換する場合が挙げられます。文字列に数値以外の文字が含まれている場合、この関数は std::invalid_argument 例外をスローすることがあります。
try {
std::string input = "abc";
int number = std::stoi(input); // これは例外をスローします
std::cout << "Number: " << number << std::endl;
} catch (std::invalid_argument& e) {
std::cout << "Invalid input! Please enter a valid number." << std::endl;
}tryブロック内で例外が発生すると、プログラムはそのブロック内の残りのコードの実行を直ちに停止し、catchブロックにジャンプします。これにより、プログラムのクラッシュを防ぎ、何らかの問題が発生した際に、ユーザーに対して有益なフィードバックを提供できるようになります。
チャレンジ
簡単try ブロックと catch ブロックを使用して、安全な文字列から数値への変換を行うプログラムを作成してください。このチャレンジでは、ユーザー入力の文字列を整数に変換する際に発生する例外を処理する方法についての理解をテストします。
以下の入力が提供されます:
- 有効な整数を表している場合とそうでない場合がある文字列
userInput
プログラムは以下の手順を実行する必要があります:
std::stoiを使用した文字列から整数への変換をtryブロックの中に配置します- 変換に成功した場合は、変換された数値と成功メッセージを出力します
- 文字列に数値以外の文字が含まれている場合に発生する
std::invalid_argument例外を処理するためにcatchブロックを使用します - catch ブロック内で、入力が無効であることを示すエラーメッセージを出力します
以下の正確な出力形式を使用してください:
変換に成功した場合:
Valid number: [converted_number]例外をスローする無効な入力の場合:
Error: Invalid inputstd::stoi は、整数に変換できない文字列に遭遇したときに std::invalid_argument 例外をスローすることに注意してください。try ブロックには変換の試行を含め、catch ブロックにはこの特定の型のエラーを処理するために例外タイプとして std::invalid_argument& を指定する必要があります。例外が発生すると、プログラムは直ちに try ブロックから対応する catch ブロックにジャンプし、プログラムのクラッシュを防ぎます。
チートシート
try と catch ブロックを使用して、例外を安全に処理します:
try {
// 例外をスローする可能性のあるコード
} catch (exception_type e) {
// 例外を処理するコード
}std::stoi による文字列から整数への変換の例:
try {
std::string input = "abc";
int number = std::stoi(input); // これは例外をスローします
std::cout << "Number: " << number << std::endl;
} catch (std::invalid_argument& e) {
std::cout << "Invalid input! Please enter a valid number." << std::endl;
}try ブロック内で例外が発生すると、プログラムは直ちに対応する catch ブロックにジャンプし、クラッシュを防ぎ、適切なエラー処理を可能にします。
自分で試してみよう
#include <iostream>
#include <string>
using namespace std;
int main() {
// 入力を読み込む
string userInput;
cin >> userInput;
// TODO: 以下にコードを記述してください
// 文字列を変換するために std::stoi と try-catch ブロックを使用してください
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。