エラー処理(例外処理)

エラー処理
標準関数のエラー処理:
標準関数では、何らかのエラーが発生した場合、
そのエラーについての情報を
関数の戻り値として示すことがあります。
この戻り値を用いて、エラーを修正できるように
プログラムを組んでおくと、
エラーがプログラム全体に与える影響をおさせた
り、取り除くことができます。
エラー処理
• sscanfの場合
sscanfは、正しく読み込めたデータの個数を返します。
この戻り値を使うことで,正しくデータを読めたかを
プログラム側でチェックできます。
エラー処理
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int a,b,c,result;
result = sscanf(Edit1->Text.c_str(),"%d %d %d",&a,&b,&c);
if (result != 3){
Label1->Caption = "読み込みエラーです。データの並びを確認してください。";
}
else
Label1->Caption = IntToStr(a) + " " + IntToStr(b) + " " + IntToStr(c);
Label2->Caption = IntToStr(a + b*c);
}
エラー処理
• BCBの場合:
例外(エラー)を扱うVCLのクラスとして、
Exceptionが用意されている。
c++のキーワード
try と catch とともに使う
エラー処理
• BCBでの例外処理の例
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int i;
int a;
Label3->Caption = " ";
for (i = 0;i < 10;i++){
a = 5.0/(5.0-i);
Label3->Caption = Label3->Caption + IntToStr(i) + " ";
}
}
エラー処理
• 0除算によるエラーが発生するが、VCLは
自動的にエラー処理を行い計算を中止し、
エラーを解除したのち、メッセージボックス
にてエラーをユーザーに通知する。
このとき、計算は中止されており最後まで
実行されない。
エラー処理
• プログラムの途中でエラーが起こった時に、
その条件だけはずして、続けて処理を行い
たいときには、プログラム側でエラーを捕
まえて、適切な処理を行い、プログラムを
継続する。
→ 例外処理
エラー処理
• VCLを用いたtry~catch構文
try
{
//ここに、例外が発生するかもしれないコードを書く。
}
catch (catch(const Exception &E)
{ //例外が発生すると、クラスExceptionの変数Eに
//その情報がはいって、ここに実行が移る。
//ここに、例外処理を書く。
}
エラー処理
• VCLのクラス:Exception
発生したエラーを格納するクラス
メンバ関数ClassName()にて、
発生したエラーを判別できる。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int a,b,c;
try{
a = StrToInt(Edit1->Text);
b = StrToInt(Edit2->Text);
c = a/b;
}
catch (const Exception &E){
if (AnsiString(E.ClassName()) == "EDivByZero")
ShowMessage("0では割り算できません");
else if(AnsiString(E.ClassName()) == "EConvertError")
ShowMessage("変換エラー "+E.Message);
else
ShowMessage(AnsiString(E.ClassName())+" "+ E.Message);
return;
}
Label1->Caption = "A/B = " + IntToStr(c);
}
エラー処理
• 変換と計算をtry構文の中で行う。
• 例外が発生した場合は、それをException
のインスタンス(変数)Eとして、catch構文で
つかまえている。
• 捕まえた例外Eは、まずそれが
EDivByZero(0除算例外のエラークラス)
EConvertError(文字列またはオブジェクト
の変換エラーかどうか調べ、対応する。¥