・ExecSの例外処理に「On Error Goto」を使ってしまった。orz ― 2011/08/24 13:18
酢こんぶの自作ソフト「ExecS」はVisualBasic2008ExpressEditionを使って作られている。
VB6時代のエラー処理は「On Error」ステートメントを使うのが普通だったが、VB.NETでは「Try Catch」構文を使うのが普通で、前者は「非構造化例外処理」、後者は「構造化例外処理」と呼ばれている。(VB.NETでは「エラー」を「例外」と呼ぶ)
「構造化プログラミング」がもてはやされる現代においては、当然のごとく「構造化例外処理」が推奨されており、酢こんぶも「On Error Goto」なんて過去の遺物だと考えていた。
しかしExecSの例外処理でどうしても「非構造化例外処理」を使わざるを得なくなってしまった。orz
やりたかったのは、
「ExecSの立ち上げたプロセスが、
子プロセスを立ち上げているかどうか検査する」
ということなのだが、これを下記の手順で実現している。
(1)現時点で動いている全プロセスのリストを取得する。
(2)For文を使って各プロセスの親プロセスを順次取得する。
(3)親プロセスがExecSの立ち上げたプロセスかどうか検査する。
(4)リストの最後まで(2)-(3)を繰り返す。
ここで問題になるのが、(1)の時点では存在していたが、(2)の時点で存在しないプロセスを処理しようとすると例外が発生する、ということだ。
通常、Windows上ではかなりの数のプロセスが立ち上がっているので(2)-(4)の処理には時間がかかる。プロセスのリストを得た時点では存在したプロセスが(2)-(4)の処理中に終了して存在しなくなるというのは珍しいことではないから、対策としては、
(a)例外が発生しないように厳密にチェックする。
(b)例外が発生することを前提にして例外処理をする。
のうちのどちらかということになるが、タイミングによっては(2)の時点で存在したプロセスが(3)の時点では存在しないという場合も考えられるから、この場合は(2)の時点で厳密にチェックしたとしても例外が発生してしまう。しかも、例外を発生させることなくプロセスが存在するかどうかを検査する方法が見つけられないのだ。(T_T)
というわけで選択肢は「例外処理をする」しか残されていない。
ところで今回の例外はFor~Nextの中で発生し、例外が発生したとしても処理を継続することが必要なわけだが、
構造化例外処理は処理の継続ができない
のだ。
「On Error Goto」を使う場合は「Resume」によってモジュール内の任意の場所に戻ることができるのだが、「Try~Catch」の場合は例外処理終了後には必ずモジュールを抜けなければならないので、For~Nextのループに戻ることができない。これでは困るので、推奨されていない「非構造化例外処理」を行なうしかなくなってしまったわけだが、もともときれいとはいえないソースで誰にも見せたくないと思っていたが、それに輪をかけて「絶対見せたくないソース」に昇格(^_^;することに、、、。
なんか今回のような例外処理は頻繁に必要になりそうな気がするのだが、「非構造化例外処理」にせざるを得ないのは酢こんぶの実力不足が原因で、世の中のプログラマの人は「構造化例外処理」で何とかしているんでしょうかね?
------------------------------------------
このブログの本店「木全屋かるた堂」もよろしくです。
・ファーストガンダムのかるた売ってます。
・ファイル整理に便利な自作ツール置いてます。
・写真(コスプレ、ポートレート、動物)公開してます。
------------------------------------------
VB6時代のエラー処理は「On Error」ステートメントを使うのが普通だったが、VB.NETでは「Try Catch」構文を使うのが普通で、前者は「非構造化例外処理」、後者は「構造化例外処理」と呼ばれている。(VB.NETでは「エラー」を「例外」と呼ぶ)
「構造化プログラミング」がもてはやされる現代においては、当然のごとく「構造化例外処理」が推奨されており、酢こんぶも「On Error Goto」なんて過去の遺物だと考えていた。
しかしExecSの例外処理でどうしても「非構造化例外処理」を使わざるを得なくなってしまった。orz
やりたかったのは、
「ExecSの立ち上げたプロセスが、
子プロセスを立ち上げているかどうか検査する」
ということなのだが、これを下記の手順で実現している。
(1)現時点で動いている全プロセスのリストを取得する。
(2)For文を使って各プロセスの親プロセスを順次取得する。
(3)親プロセスがExecSの立ち上げたプロセスかどうか検査する。
(4)リストの最後まで(2)-(3)を繰り返す。
ここで問題になるのが、(1)の時点では存在していたが、(2)の時点で存在しないプロセスを処理しようとすると例外が発生する、ということだ。
通常、Windows上ではかなりの数のプロセスが立ち上がっているので(2)-(4)の処理には時間がかかる。プロセスのリストを得た時点では存在したプロセスが(2)-(4)の処理中に終了して存在しなくなるというのは珍しいことではないから、対策としては、
(a)例外が発生しないように厳密にチェックする。
(b)例外が発生することを前提にして例外処理をする。
のうちのどちらかということになるが、タイミングによっては(2)の時点で存在したプロセスが(3)の時点では存在しないという場合も考えられるから、この場合は(2)の時点で厳密にチェックしたとしても例外が発生してしまう。しかも、例外を発生させることなくプロセスが存在するかどうかを検査する方法が見つけられないのだ。(T_T)
というわけで選択肢は「例外処理をする」しか残されていない。
ところで今回の例外はFor~Nextの中で発生し、例外が発生したとしても処理を継続することが必要なわけだが、
構造化例外処理は処理の継続ができない
のだ。
「On Error Goto」を使う場合は「Resume」によってモジュール内の任意の場所に戻ることができるのだが、「Try~Catch」の場合は例外処理終了後には必ずモジュールを抜けなければならないので、For~Nextのループに戻ることができない。これでは困るので、推奨されていない「非構造化例外処理」を行なうしかなくなってしまったわけだが、もともときれいとはいえないソースで誰にも見せたくないと思っていたが、それに輪をかけて「絶対見せたくないソース」に昇格(^_^;することに、、、。
なんか今回のような例外処理は頻繁に必要になりそうな気がするのだが、「非構造化例外処理」にせざるを得ないのは酢こんぶの実力不足が原因で、世の中のプログラマの人は「構造化例外処理」で何とかしているんでしょうかね?
------------------------------------------
このブログの本店「木全屋かるた堂」もよろしくです。
・ファーストガンダムのかるた売ってます。
・ファイル整理に便利な自作ツール置いてます。
・写真(コスプレ、ポートレート、動物)公開してます。
------------------------------------------
コメント
トラックバック
このエントリのトラックバックURL: http://karutadou.asablo.jp/blog/2011/08/24/6066582/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。