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{}文


の内容は


自分でその都度作製するという方法が


考えられたわけです」





























  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング   ver3.2307 @solarplexuss

★で称える

この小説が面白かったら★をつけてください。おすすめレビューも書けます。

フォローしてこの作品の続きを読もう

この小説のおすすめレビューを見る

この小説のタグ