- PR -

プログラムの終了方法

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-03-13 20:10
引用:

なびさんの書き込み (2008-03-13 19:06) より:

ありがとうございます。

ErrSyori:
MsgBox("モジュールエラー")

のMsgBoxがなかった場合
Form1に制御が戻るのですが
Catch ex As Exception で
引っかかりません。
(1)

標準モジュール処理が
あまりにも長く、複雑な為
Tryにしていないからでしょうか?
(2)

Throwでもすればよいのでしょうが・・

どうすべきでしょうか?



どういう事を知っていて、どういう判断をするから、このような意見になっているのでしょうか?


(1)
 On Error で処理しているので、例外が発生していないからです。

(2)
 長くていいのか、見直しをします。可能なら、コマ割りします。


 全体を Try 〜 Catch で囲むのは愚の骨頂です。キャッチする必要があるものだけキャッチして、その他はランタイムに任せます。というのは、例外が出るのは、設計から製造まで通して、本当に想定していない状況(アプリケーションとして、あってはいけない状況)だけにするべきだからです。何が何でもアプリケーションを走らせるために On Error や Try 〜 Catch をすると、本当はつぶしておかなければならないバグを見つけられなくなってしまいます。


bbコード間違えた。

[ メッセージ編集済み 編集者: Jitta 編集日時 2008-03-13 20:40 ]
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2008-03-14 09:49
おはようございます。

--標準モジュール処理-----------
Function Syori

On Error GoTo ErrSyori

いろいろ処理
ErrSyori:
MsgBox("モジュールエラー") ここで終わらせたい

End Function
----------------------------------------

うまく説明できませんが
なんとか上記のところで終わらせたいのです。

コマ割りしますとは
プロシージャを別けるということですよね・・



たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2008-03-14 12:14
私がコーディングするならば、の話からします。

1.「標準モジュール処理」の「Syori」でMsgBoxは使いません。
「標準モジュール処理」からはUI要素を排除したほうが良いでしょう。
何かのエラーが発生したら、戻り値等で呼び出し元に知らせます。
システムが続行不可能な障害の時には、例外を発生させます。


2.「timJob_Tick」の処理中はタイマーを一時停止させます
「10秒毎に(タイマーのInterval設定)」とありますが、この10秒
がよほど正確でなければいけないのでないかぎり、私のプログラムでは、
処理中はタイマーを一時停止しています。
そして、「timJob_Tick」の最後の行でタイマーを再度有効にします。
「timJob_Tick」処理が次のインターバルまでに終わる保障が無いから
です。
タイマーを止めないということは、いくらなんでも終わるだろう、と
いう期待と予想があるか、実測してほぼ100%大丈夫ということが判っ
ているということなのでしょう。
しかし、それで、この処理が100%、時間内に終わることが保障されて
いるわけではありません。
Windowsはそのアプリ以外の多くの処理を同時に行っているので、10秒
位ほかのことをやっているかもしれないからです。
このコードのままですと、許された時間内に処理が終了しなければ、
再度呼び出されることになります。
ですが、複数回呼び出されても良いように作られていないようです。
これは危険です。このようなリスクを犯すようなコードにはしないほう
が良いです。

さらに、もともと、タイマーはそれほどまでに正確だとはいえない代物
ですから、それに依存する仕様となっているのだとしたら、それも問題
となります。

ファミコン等の古いゲーム機のドラクエとかシューティングゲームとかで、
表示要素が多くなりすぎたとき、歩く速度、飛ぶ速度が半分になるの
を見たことがあるかもしれません。
あれは、許された処理時間中に処理が全部終了しなかったため、次の
インターバルに処理の積み残しをしているからああなっています。
通常は1回の処理時間でできることを、2回分使っているわけですから、
プレイヤーから見ると、半分の速度に見えるわけです。
割り込み間隔が絶対だとしたら、これと同等な処理を記述する必要が
あります。けっこう大変なコードになりますよ。


3.「On Error GoTo」は、そのエラーがあらかじめ予測できるところ
にだけ書きます。そうしなければ、
・コーディング時に予測できなかったエラーを見逃してしまいます。
・実運用時に予想外の障害が発生しても、捕捉することができません。


引用:

何とか1回のみの表示にしたいのですが・・
何か良い方法ないでしょうか?



すでに回答がありましたが、

・タイマーを止める
が一番良いと思います。

・処理の抑止
が次に良いと思います。
処理が終了しないうちに呼び出されたら、再度呼び出すのをやめます。

・UI表示を抑止する
MsgBoxの表示をやめるものです。
これは解決にならない可能性が高いです。
場合によっては、何度も「Syori」が呼び出されることになります。


10秒に1回のタイマーでなければ役に立たないのだとしたら、
私はならば、標準のメッセージボックスを使わないです。
ユーザ入力を待機するメッセージボックスは、勝手に進行する
タイマーと同時に使うのはよくないからです。
もしも私が作るならば、メッセージボックスの代わりに、自力で
ダイアログボックスを作って、タイマーと同調するようにします。

_________________
たつごろー
codeseek
こみゅぷらす
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2008-03-14 20:04
大変、丁寧にありがとうございます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-03-14 21:53
引用:

なびさんの書き込み (2008-03-14 09:49) より:
うまく説明できませんが
なんとか上記のところで終わらせたいのです。


え〜!!!そんなこと、一言も書いてありませんよ?!
引用:

なびさんの書き込み (2008-03-13 13:18) より:
このような処理で
標準モジュール処理の中でエラーが発生した場合
モジュールエラーと表示しますが
そのままにしておくと
そのままtimJob_Tickが10秒毎に発生する為
モジュールエラーのMsgBoxが何個も表示してしまうのです。

何とか1回のみの表示にしたいのですが・・

何か良い方法ないでしょうか?



確かにタイトルには「プログラムの終了方法」と書いてありますけど。

で、本当に、プログラムを終わらせていいのですか?
ここは、開発者が集まるところなので、開発者を相手にしていると思って話を進めています。
開発者であるなら、自分が何をしているか、何をしようとしているか、コードで表すことができるのは何か、ということを意識していただきたいと思います。私は、それができないような人と一緒に仕事をしたくないですから(そんな機会があるかどうかはわからないけど、あると言えないのと同様、ないとも言えないでしょ?)。

 開発者ではないなら、そういってください。それなりの対応に変えます。

スキルアップ/キャリアアップ(JOB@IT)