エラー処理 標準関数のエラー処理: 標準関数では、何らかのエラーが発生した場合、 そのエラーについての情報を 関数の戻り値として示すことがあります。 この戻り値を用いて、エラーを修正できるように プログラムを組んでおくと、 エラーがプログラム全体に与える影響をおさせた り、取り除くことができます。 エラー処理 • 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(文字列またはオブジェクト の変換エラーかどうか調べ、対応する。¥
© Copyright 2024 ExpyDoc