例外について その1

Delphiでは、沢山の例外クラスを持っています。まず最初に、EDivByZero という「値を 0 で割った時に生成される例外クラス」についてみてみます。

フォームにボタンを貼り付けて、以下のコードを書いてください。

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: Integer;
begin
  i := 0;
  j := 10 div i; // 0で割る
  ShowMessage(IntToStr(j));  
end;

すると、デバッガは例外が発生したと思われる位置を教えてくれます。

これが出てきます。

この状態で、出てきたダイアログに書いてあるとおりプログラムは停止しています。ここでは、例外について見ていきたいので、デバッガが開かれないようにします。(つまり、例外が発生しても、その処理内容を確認したら、そのままプログラムが続行できるようにします。)一度、「実行」→「プログラムの終了」でプログラムを終了してください。

例外が生成された時にプログラムが終了させないようにするためには、まず「ツール」→「デバッガオプション」で「言語固有の例外」ページにある「Delphi言語の例外で停止」のチェックをはずして下さい。はずしましたら、OK ボタンをクリックして、もう一度さっきのプログラムを実行して見て下さい。すると今度は、例外が生成されたことを教えてくれるダイアログが出てきますが、プログラムは終了していません。

これで、準備ができました。

上の例で見ましたように、値を 0 で割った場合「例外」が生成されます。Delphiでは、このような例外クラスを多数持っています。どのくらいあるのか見るために、エディタの適当な場所に「EDivByZero」と書いて F1 キーを押してください。 すると、EDivByZero についてのヘルプが出ますので、そこ少し上の方にある「 SysUtils 」をクリックしてください。すると例外クラスの一覧が出てきます。このように、いろいろな例外クラスがあります。

try..except

それでは次に、さっきのプログラムを以下のように書き換えてください。

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: Integer;
begin
  i := 0;
  
	try
    j := 10 div i; // 0で割る
	except
    on EDivByZero do
    begin
      MessageDlg('0では割れません', mtError, [mbOK], 0);
      j := 0;
    end;
  end;
  
  ShowMessage(IntToStr(j));
end;

try ブロックの中でエラーが発生した場合、except の後に記述されたコードが実行されます。 この場合、EDivByZero 例外が生成されるので except ブロックに書かれた EDivByZero 例外がキャッチされます。また注意しなければならないのは、try ブロックで例外が発生した場合、その try ブロックでの残りのコードは実行されません。

次の例を見てください。

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: Integer;
begin
  i := 0;
  try
    j := 10 div i; // 0で割る
    ShowMessage('この文は実行されません');
  except
    on EDivByZero do
    begin
      ShowMessage('0では割れません');
      j := 0;
    end;
  end;
  
  ShowMessage(IntToStr(j));
end;

このように、j := 10 div i; のすぐ下の ShowMessage は実行されません。

最後に、Edit を使った簡単な例をやってみましょう。Edit に入力された数値を用いて除算をやります。しかし、ユーザーが文字などを入力する場合があります。その例外を捕らえて適切に処理するようにしてみましょう。

まず、フォームにEdit, Button を貼り付けて下さい。そして、貼り付けたボタンをダブルクリックして以下のコードを書きます。

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, k: Integer;
begin
  i := 3200;
 
  try
    j := StrToInt(Edit1.Text);
    k := i div j;
  except
    on EDivByZero do // 0で割った時の例外
    begin
      k := 0;
      ShowMessage('0では割れません');
    end;
 
    on EConvertError do // 変換の失敗による例外
    begin
      j := 0;
      k := 0;
      ShowMessage('変換できません');
    end;
  end;
  
  ShowMessage('3200 div' + IntToStr(j) + ' = ' +
    IntToStr(k));
end;

このように、例外が生成された時、独自のメッセージを表示しつつ、kの値を変更することが出来ます。

最初に「 Delphi言語の例外で停止 」のチェックをはずしましたが、これを元に戻しておいてください。(チェックを入れて終了して下さい)


up next
Last update 2002/3/31