try{}文とcatch{}文は自作関数内に設定することもできます
ソーラー「try{}文とcatch{}文は自作関数内に設定することもできます
次のプログラムでは
自作関数内に
try{}文とcatch{}文が設定されています
ではでは(´▽`*) 次のプログラムをご覧ください
👇
#include <iostream>
using namespace std;
void newmadefunction() {
try {
int a;
cout << "0以外の数値を入力してね" << "\n";
cin >> a;
if (a == 0)throw "のおおん";
}
catch (char* err) {
cout << err<< "\n";
}
}
//👆自作関数newmadefunctionの定義内でtry{}文とcatch{}文が設定されています
int main() {
newmadefunction();
return 0;
}
プログラムの実行結果
0以外の数値を入力してね
0(を入力すると)
のおおん
ソーラー「このプログラムでは
自作関数newmadefunctionの定義にtry{}文とcatch{}文
👇
try {
int a;
cout << "0以外の数値を入力してね" << "\n";
cin >> a;
if (a == 0)throw "のおおん";
}
catch (char* err) {
cout << err<< "\n";
}
}
👆
が設定されています
main関数内で
自作関数
newmadefunction();
が実行されると
try{}文の中の
int a;
cout << "0以外の数値を入力してね" << "\n";
cin >> a;
if (a == 0)throw "のおおん";
が実行されることになります
まず
int a;
によりint型の変数aが生成され
cout << "0以外の数値を入力してね" << "\n";
により
コマンドプロンプト画面に
0以外の数値を入力してね
が表示されることになります
そして
cin >> a;
が実行されると
コマンドプロンプト画面上で
何かデータをint型の変数aに入力するよう促されます
ここで
0を入力すると
if (a == 0)throw "のおおん";
が実行され
文字列データ"のおおん"を格納しているメモリ領域の先頭のメモリのアドレス
が
throwされ
catch{}文が実行されることになります
そのとき
文字列データ"のおおん"を格納しているメモリ領域の先頭のメモリのアドレス
は
catch{}文の引数部分の
char* err
に代入されることになります
その状態で
cout <<err<< "\n";
が実行されると
コマンドプロンプト画面に
のおおん
が表示されることになります」
マックス「try{}文 ,catch{}文の構造は
if{}文の構造とそっくりだな」
ソーラー「そうですね
try{}文 ,catch{}文には
面白い使い方もあります
たとえば
自作関数newmadefunction()の定義に
int a;
cout << "0以外の数値を入力してね" << "\n";
cin >> a;
if (a == 0)throw "のおおん";
だけを記述しておきます
さきほどのプログラムでは
自作関数newmadefunctionの定義は
👇
try {
int a;
cout << "0以外の数値を入力してね" << "\n";
cin >> a;
if (a == 0)throw "のおおん";
}
👆
と記述されていました
今度の自作関数newmadefunction()の定義では
命令文を囲むtry {}
が記述されていませんね」
マックス「自作関数newmadefunction()の定義に
簡単に言うと
int型の変数aに0が代入されるとき実行される
if (a == 0)throw "のおおん";
だけが記述されていて
それを囲むtry {}が記述されていないってことか」
ソーラー「そうなんです
試しに
このように新たに定義された自作関数
newmadefunction();
を実行してみますか😊」
そのときのプログラムはこちらです
👇
#include <iostream>
using namespace std;
void newmadefunction() {
int a;
cout << "0以外の数値を入力してね" << "\n";
cin >> a;
if (a == 0)throw "のおおん";
}
int main() {
newmadefunction();
return 0;
}
ビルド実行結果
0以外の数値を入力してね
0(を入力すると)
警告文
Debug Error!
Program:
C:\Users\solarplexuss\source\repos\Project32\Debug\Project32.exe
abort() has been called
(Press Retry to debug the application)
中止 再試行 無視
ソーラー「
abortの意味は三省堂のweb辞典では
コンピューター-プログラムの実行中に、故障やエラーなどによりプログラムの実行が不可能になり、データ処理を中断すること。
となっています
なぜ
このような警告文が表示されるのかというと
if (a == 0)throw "のおおん";
が
try{}で囲まれていないからなんです」
マックス「まあ
if (a == 0)throw "のおおん";
を
try{}で囲まないように
自作関数newmadefunction()の定義を
記述したからな
しょうがないか」
ソーラー「そこで
今度は
自作関数newmadefunction()の実行
newmadefunction();
自体を
try{}で囲ってプログラムを実行してみたいと思います
そのプログラムはこちらです
👇
#include <iostream>
using namespace std;
void newmadefunction() {
int a;
cout << "0以外の数値を入力してね" << "\n";
cin >> a;
if (a == 0)throw "のおおん";
//🌞自作関数の定義にcatch{}文は記述されていません
//🌞そもそもtry{}文でないんです
}
int main() {
try {
newmadefunction();
}
return 0;
}
ビルド実行結果
エラー (アクティブ) E0530 try ブロックには少なくとも 1 つのハンドラーが必要です
エラー C2317 '23' 行目で始まっている 'try' ブロックには catch ハンドラーがありません
マックス「いい??
これは何をしようとしているんだ?」
ソーラー「あっ しまった
try {
newmadefunction();
}
には
相方の
catch{}文が必要なんです
次の訂正したプログラムをご覧ください
👇
#include <iostream>
using namespace std;
void newmadefunction() {
int a;
cout << "0以外の数値を入力してね" << "\n";
cin >> a;
if (a == 0)throw "のおおん";
//🌞自作関数の定義にcatch{}文は記述されていません
//🌞そもそもtry{}文でないんです
}
int main() {
try {
newmadefunction();
}
catch (char* err) {
cout << err << "\n";
}
return 0;
}
プログラムの実行結果
0以外の数値を入力してね
0(を入力すると)
のおおん(が表示されます)
てんC「
void newmadefunction() {
int a;
cout << "0以外の数値を入力してね" << "\n";
cin >> a;
if (a == 0)throw "のおおん";
//🌞自作関数の定義にcatch{}文は記述されていません
//🌞そもそもtry{}文でないんです
}
と定義された自作関数
newmadefunction();
の実行自体を
try{}で囲ったのですね」
マックス「そうか とりあえず
try{}文
と
catch{}文
のセットを構成したってわけだ
ただ
なんで
このような使い方が登場してくるんだ?
普通に自作関数newmadefunctionの定義内に
try{}文とcatch{}文を設定しておけばいいだけの話じゃないか
こんなふうにだぁ
👇
void newmadefunction() {
try {
int a;
cout << "0以外の数値を入力してね" << "\n";
cin >> a;
if (a == 0)throw "のおおん";
}
catch (char* err) {
cout << err<< "\n";
}
}
って
さっきの
自作関数newmadefunctionの定義なんだけどな」
ソーラー「おお・・
ちゃんと
自作関数newmadefunctionの定義内に
try{}文とcatch{}文が設定されている・・・」
マックス「ふっ・・・
みとれたか!」
ソーラー「おおっと
なぜ
自作関数newmadefunctionの定義内に
if (a == 0)throw "のおおん";だけ記述し
catch{}文を記述しないか?
ということでしたね
自作関数newmadefunctionの定義内に
if (a == 0)throw "のおおん";が記述された
自作関数newmadefunctionを作製したとします
このとき
内容が複雑な
自分で作製した自作関数はファイルにいつでもつかえるよう保存する場合があります
いろいろなプログラムでも
その自作関数を使いたいというわけです
もちろんたくさんの人がその自作関数を使う場合もあります
main関数内で
その自作関数を
使用するときは
その自作関数をtry{}(トライブロック)で囲んで
実行することになります
自作関数newmadefunctionの定義内に
if (a == 0)throw "のおおん";が記述されているので
catch{}文
は自分でその都度作製することになります
つまり
if (a == 0)throw "のおおん";
を備えた自作関数はファイルに保存しておいて
どのような
catch{}文が実行されるかを
自分でその都度
決めることができるというわけなんです
今のように
自作関数の定義内に
try{}文とcatch{}文が記述されていると
自作関数の実行時
例外的な処理が行われたとき
必ず
catch{}(キャッチブロック)内の命令文が実行されることになります
ですので
例外処理が行われた場合
自分の思うような命令文を実行させたい場合は
自作関数の定義内の
catch{}(キャッチブロック)内の命令文
を書き換えることになります
ですが
最初から
例外処理が行われた場合
どの様な命令文が実行されるか
は
使用する人によって決めるということになっている場合は
必要なのは
try{}文の内容だけです
そこで
自作関数の定義内に
if (a == 0)throw "のおおん";
のような例外処理
の部分だけを記述しておいて
ファイルに保存し
main関数内で
その自作関数を
使用するときは
その自作関数をtry{}(トライブロック)で囲んで
catch{}文
の内容は
自分でその都度作製するという方法が
考えられたわけです」
🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307 @solarplexuss
★で称える
この小説が面白かったら★をつけてください。おすすめレビューも書けます。
フォローしてこの作品の続きを読もう
ユーザー登録すれば作品や作者をフォローして、更新や新作情報を受け取れます。🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307の最新話を見逃さないよう今すぐカクヨムにユーザー登録しましょう。
新規ユーザー登録(無料)簡単に登録できます
この小説のタグ
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます