§2 電圧、電流、抵抗の値を求めるツール VB6 | |
(3) エラー処理 |
電流の値を計算するときに抵抗の値がゼロであると、ゼロで割り算をすることになりエラーが発生する。エラーが発生するとプログラムはそこで中断してしまうので、中断しないような処理が必要になる。
エラー処理方法 1
抵抗の値がゼロであるかどうかをIf文で判定して、ゼロであればMsgBoxなどでメッセージを表示して電流の値を計算しないようにする。
リストの赤色部分が追加した処理である。抵抗値はText2に入力されるので、それが0のときにはメッセージを表示している。
Private Sub Command1_Click() '計算開始ボタン Dim ans As Double, sans As String If Option1.Value = True Then '電流計算 If Val(Text2.Text) = 0 Then MsgBox "抵抗値が0です。計算できません。" Else ans = Val(Text1.Text) / Val(Text2.Text) If Abs(ans) < 1 Then '-1<ans<1のとき、整数部に0を付ける If ans < 0 Then sans = "-0" & Str(Abs(ans)) Else sans = "0" & Str(ans) End If Else '-1<ans<1以外とき sans = Str(ans) End If Label3.Caption = "電流は、" & sans & "[A]です。" '結果表示 End If ElseIf Option2.Value = True Then '電圧計算 ans = Val(Text1.Text) * Val(Text2.Text) <<以下、省略>>
エラー処理方法 2
VisualBASICのエラートラップを使う。エラーが発生したときに中断せずに指定した処理に移るようにする仕組みである。VisualBASICでは、On Error Goto 命令を使う。Goto
の次に移動先を指定する。
リストの赤色部分が追加した処理である。On Error Goto でエラーが発生したときにラベルerr1へ移るようにしている。On Error以降でエラーが発生したときはラベルerr1へ移動する。
Private Sub Command1_Click() '計算開始ボタン Dim ans As Double, sans As String On Error GoTo err1 'エラートラップ If Option1.Value = True Then '電流計算 <<略>> Label3.Caption = "抵抗は、" & sans & "[Ω]です。" End If Exit Sub 'エラーが発生しないときはここでプロシージャを抜け出す。 err1: 'エラーが発生したときはここから処理される。 MsgBox "抵抗値が0です。計算できません。" End Sub
このプログラムではOn Error 以降のすべてのエラーに対してエラー処理されるので、どのようなエラーであっても「抵抗値が0です。計算できません。」と表示される。
0でわり算したときのエラーは "6 オーバーフロー" のようにエラーに対して番号が付いている。このエラー番号はErr.Number*1で参照できる。これを利用してオーバーフローのエラーに対してのみメッセージを出すようにすると次のようになる。
err1: 'エラーが発生したときはここから処理される。
If Err.Number = 6 Then
MsgBox "抵抗値が0です。計算できません。"
Else
MsgBox "その他のエラーです。" & Err.Number
EndIf
End Sub
これでオーバーフローに対してのみにメッセージが表示される。さらにオーバーフロー以外のエラーについてもエラー番号が表示されるので、必要であればそれに対応する処理をすることができる。
エラー番号については、ヘルプを参照すること(キーワード:トラップできるエラー)。
=== ポイント ===
エラー発生によって中断しないような対策が必要である。ここで扱った処理をまとめておく。
- データ入力などにおいて、データとして正しいもの以外を排除する。
同じように、ある状態のときに特定のボタンが選択できないようにするなど、ケースによって入力できる状態を作ることも必要である。- エラートラップで対応する。
予測のつかないエラーにも対応できるが、On Error を書くことによって常にエラーの監視をすることになる。スピードが要求されるものではひかえた方が良い。
*1 Err.NumberのErrはフォームなどに貼り付ける形のオブジェクトではないが、エラーオブジェクトと呼ばれ、実行中のエラーに関する情報を持つオブジェクトである。このようなオブジェクトにAppオブジェクト、作成中のアプリケーションに関する情報を持つオブジェクトがある。
(3) エラー処理 | |
Copyright © 2001,2002 Hiroshi Masuda |