- VBプログラマ質問スレ(Ver.6.0 まで) part64
803 :デフォルトの名無しさん[sage]:2015/08/18(火) 00:15:54.45 ID:jyJvXHy3 - >>800
だからお前の言う「例外処理」の中身が何かを言えれば 問題は解決するんだよ。 ログは呼び出し元でやる。 リトライも呼び出し元である。 なぜならログに出すかどうかは リトライするかどうかは呼び出し元がが決めることで 勝手にやることじゃないからだ。 お前の言う「例外処理」の中身はなんだよ。 見つからないから言えないだろ > だから、呼び出し階層の何階層も下で発生した例外に対して適切な処理なんかできるわけないだろ。 だからお前の言う「適切な処理」ってなんだよ。 さっき聞いたら、ログとかリトライとか 間違った答えを言ったよな?
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
805 :デフォルトの名無しさん[sage]:2015/08/18(火) 00:17:32.02 ID:jyJvXHy3 - >>800
> 出来るのは単に捕捉して何もしないだけ。 俺は原則として捕捉すんなって言ってんの。 イベントハンドラ以外でOn Errorを書かないって言ってるんだから そういうことだろ。 なんで捕捉するんだよ。 捕捉したってできることなにもねーだろ。 あるというのならその具体的な中身 言ってみろって。
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
807 :デフォルトの名無しさん[sage]:2015/08/18(火) 00:20:08.58 ID:jyJvXHy3 - >>804
> VBって例外でしか帰ってこないオブジェクトなんてざらだし 例外でしか帰ってこないんじゃなくて エラーは例外で返すのが正しいやり方だからだよ。 内部で発生したエラーは何もすることがなければ 内部でトラップする必要もない。 内部で何かすることがあれば別だが 基本的に何もない。 だから内部でトラップする必要はないし、 例外は呼び出し元で処理する。 ちなみに俺が言ってる処理の内容とは ログに保存するとかリトライのために再実行するとかだな。
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
809 :デフォルトの名無しさん[sage]:2015/08/18(火) 00:25:20.58 ID:jyJvXHy3 - という感想はいらないから、レスしてねw
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
811 :デフォルトの名無しさん[sage]:2015/08/18(火) 00:26:43.68 ID:jyJvXHy3 - 一応話をそらすことが出来ないように、
>>761で俺が言ったことを再掲しておこう。 761 自分:デフォルトの名無しさん[sage] 投稿日:2015/08/17(月) 10:40:58.03 ID:HKx5lNza [2/13] >>756 VB6では不可能。 だけれど、ひとつの関数に、複数のOn Errorがあるときは コードが複雑だって考えた方がいい。 多くの場合、関数一つに対して、 On Errorは全くないか、一個だけ。 そして基本的にフォームにのみOn Errorが存在する。 フォームから呼び出されるモジュールやクラスには Err.raiseをやっても、On Errorは存在しない。 On Errorが必要なのは、終了処理が必要な場合とか 内部で勝手にリトライする場合とかだけだから。
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
813 :デフォルトの名無しさん[sage]:2015/08/18(火) 00:53:31.94 ID:jyJvXHy3 - >>812
こう書けばいいじゃん? VB6を使っていたのはもうずっと昔だから 細かい構文は所は言いっこなしな。 Private Sub Button1_Click() Dim ret As MyResult On Error Goto Failback Set ret = foo() PrintData(ret) Exit Sub Failback: On Error Goto ErrHandler Set ret = bar() PrintData(ret) Exit Sub ErrHandler: ErrorLog(Err) End Sub > 何らかしらの要因で実行時エラーが発生したとき 実行時エラーの種類は問わないってことでいいよね? 問う場合は、エラー番号で処理を変えるだけだけど。
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
814 :デフォルトの名無しさん[sage]:2015/08/18(火) 00:57:26.53 ID:jyJvXHy3 - 補足しておくと
> 何らかしらの要因で実行時エラーが発生したとき、代替としてsql2の結果セットを > 取得したい場合はどうするの? 代替の結果セットを使うという処理を透過的。 つまり内部で発生したsql1の結果セット取得のエラー発生を 握りつぶしたい。という場合なら、内部でやるのが正しい。 だがそういうことは例外中の例外。 まずそんな要件が必要になることは殆ど無いない。 だから、基本的に内部でエラーのトラップはしないと 言ったんだ。
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
816 :デフォルトの名無しさん[sage]:2015/08/18(火) 01:08:42.63 ID:jyJvXHy3 - >>815
多用するならヘルパー関数を用意すればいいだけ。 そういうのは例外なんで 例外の話を持ちだしても意味は無いよ。
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
818 :デフォルトの名無しさん[sage]:2015/08/18(火) 01:30:38.65 ID:jyJvXHy3 - >>817
> 例外?何を基準に例外と言ってるんだろう。 世の中のオープンソースのコード。 でいいんじゃない? 言語が違ってもやりかたは一緒。 見かけるというのなら、オープンソースという 誰もが検証可能な方法で見せてよ。 関数が1000個あったとすれば、 そんなエラーの時に代替関数を呼ぶ なんてコードは1個あるかどうかでしょう?
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
819 :デフォルトの名無しさん[sage]:2015/08/18(火) 01:34:46.76 ID:jyJvXHy3 - >>817
> 何かこだわりがあるの? そりゃあるでしょw プログラムっていうのは簡単に複雑になるのだから よりシンプルになる方法にしないといけない。 よりシンプルっていうのはひとつの関数が やる役割は一つであるということ。 sql1の結果を返す関数、sql2の結果を返す関数 フォールバック関数。にそれぞれわけて それぞれの関数を単体テストを行う。 そうすればフォールバック処理を行う関数が いくらあったとしても、フォールバック部分の 単体テストコードは一つで良くなる。 よりシンプルにするため、関数内で勝手にフォールバックを 行うという処理は極力避けないといけない。
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
822 :デフォルトの名無しさん[sage]:2015/08/18(火) 01:46:16.89 ID:jyJvXHy3 - > 戻りもどの関数を抜けたかログに出すことがあると思うんだけど、
Err.souceとかerlで取得すればいいじゃん?
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
823 :デフォルトの名無しさん[sage]:2015/08/18(火) 01:47:01.25 ID:jyJvXHy3 - >>821
> でもVB6にNUNITやJUNITみたいなもんってあったっけ? vbUnitがあるだろ
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
833 :デフォルトの名無しさん[sage]:2015/08/18(火) 22:46:33.49 ID:jyJvXHy3 - >>826
> 例外処理の中身なんて例外ごとに違うのに具体的に言えるわけがない。 自分で適当な例を作ればいいだろ。
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
834 :デフォルトの名無しさん[sage]:2015/08/18(火) 22:48:27.52 ID:jyJvXHy3 - >>828
> ファイルオープンエラーが発生したとき、Errにはエラー番号とその番号に対応したメッセージしか入っていない。 > どこで、何のファイルを、どうオープンしようとしたかを取得できないし、もちろんスタックトレースも取れない。 取れるようにすればいいだけじゃん。 しかも、別に取れなくても動作には問題ない。 その機能はオプションだ。
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
835 :デフォルトの名無しさん[sage]:2015/08/18(火) 22:58:32.11 ID:jyJvXHy3 - >>831
その例ではfoo()という関数がデータベースを扱っている。 だがfoo()だけでで終わるプログラムはないだろう。bar()やbaz()も存在する。 さて、その例ではfoo()だけを呼んでいるが、 foo()とbar()を実行するとしたらどうなるか? foo()の中でcommit()してはならないことが多いだろう。 foo()とbar()の両方の処理ができた時commit()を行う。 つまりfoo()やbar()やbaz()関数の中でcommit()やrollback()を 行うのは間違いだということだ。 また外にあることからわかるようにデータベースの接続は関数の引数として渡す。 もちろんクラスにしてインスタンスプロパティとして持たせても良い。 つまり回答はこういうことだ Private Sub Button1_Click() On Error Goto ErrHandler Set conn = new DBConnection Set logic = new DBLogic logic.conn = conn conn.begin(); logic.foo() logic.bar() conn.commit(); Exit Sub ErrHandler: conn.rollback(); End Sub
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
836 :デフォルトの名無しさん[sage]:2015/08/18(火) 23:04:46.25 ID:jyJvXHy3 - なんか実装詳細とかいっているからこう訂正しておこう
Private Sub Button1_Click() On Error Goto ErrHandler Set res = new Resource Set logic = new Logic logic.res = res res.init(); logic.foo() logic.bar() res.save(); Exit Sub ErrHandler: res.reset(); End Sub このコードは内部でデータベースを使うかどうかは関係ない。 ファイルを使っても実装可能。 本来コネクション(リソース)と そのコネクション(リソース)を使ったロジックは分けるべきもので、 実際各種ライブラリを見れば分かれている。 commitやrollbackは関数内部で呼び出すものじゃない。 そういうことをすると関数に汎用性がなくなり 別の箇所で使いづらくなってしまう。
|
- VBプログラマ質問スレ(Ver.6.0 まで) part64
837 :デフォルトの名無しさん[sage]:2015/08/18(火) 23:10:47.20 ID:jyJvXHy3 - >>828
> ファイルオープンエラーが発生したとき、Errにはエラー番号とその番号に対応したメッセージしか入っていない。 > どこで、何のファイルを、どうオープンしようとしたかを取得できないし、もちろんスタックトレースも取れない。 これに関してはVBの問題でもある。 この(不完全な)解決策を俺は知っているが、 あんたはどう書くつもりかね? 特にスタックトレースとか、 あんたなら取れるっていうんだろう? >>834でも書いたように、この機能はオプションだ。 だから欲しいならば追加で書けばいい。 だが書かなくてもいい。情報が得られないだけで正しく動く。 俺の言うとおりの例外を書き方をしていればね。
|