- PR -

Try の中

投稿者投稿内容
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2008-03-03 02:02
便乗質問ですみませんが、

引用:

Jittaさんの書き込み (2008-03-01 07:39) より:
catch ブロックを、[b]例外を握りつぶすために使ってはいけません。



握りつぶしたいときはどうしたらいいのでしょうか?
私はcatchで握りつぶしてしまってます…。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-03-03 22:15
引用:

れいさんの書き込み (2008-03-03 02:02) より:
握りつぶしたいときはどうしたらいいのでしょうか?
私はcatchで握りつぶしてしまってます…。


 間違いました。

 チェックすれば発生させずに済ませられる例外を、発生させて握りつぶしてはいけません。
…なんか、まだ考えを適切に表現できていないように思うので、突っ込んでください(反応鈍いですが)。


 なんか、一部だけ見ているからだと思うけど、2008-02-29 13:44 のコードって、イミフメイ...
引用:
コード:
Try
    '*** パス取得
    '*** INIファイル
    '*** DataSet取得
Catch ex As Exception
    MessageBox.Show(ex.Message)
    Me.Close()
End Try



こっち使おう。
 このコードで、try ブロックでどんな例外が発生する可能性があるのか。このスケルトン コードからは、その考察がされていないことが伺えます。特に、Exception しか受けていないことから。それは、設計としてあり得ないと思います。そもそも、.NET Framework での例外は、仕様による想定の範囲外の事象が発生したときに、安全にプログラムを終了、または続行させられるように使うよう、勧められています。もっとも、「どこまで仕様として想定するか」については、これまでも何度か議論されていますし、明確な線引きができないところであると思っています。
 また、catch ブロックでは、例外のリスローがされていません。一部しか見ていないので適切な判断はできませんが、リスローしなくていいのか、考察がされていないように思います。特に、Me.Close というのが気になります。このメソッドがあるクラス、いったいなんでしょう?
 ここで、「パス取得」「INIファイル(からデータを取り出す)」「DataSet取得」という処理がありますが、どれも例外が発生する可能性があります。パスの取得に失敗すれば、INI ファイルの取得はできないでしょう。INI ファイルからデータが取れなければ、DataSet からデータを持ってくるためのデータが整わないことが考えられます。そういった、メソッドの中断処理が、例外によって行われているような感じもします。その時に Me(ってなんだ?)を閉じていいのでしょうか。もう一歩進めば、Me を開くのは、パス取得と INI ファイルの処理が済んでからでもいいのではないでしょうか。そうすればここで Me を閉じる必要はなく、例外処理によって Close をさせる必要もないと思います。

 つまり、このコードは、「Me.Close をしたいがために、例外を発生させている」ように思います。これは、してはいけないことだと思います。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2008-03-04 00:18
引用:

Jittaさんの書き込み (2008-03-03 22:15) より:
引用:

れいさんの書き込み (2008-03-03 02:02) より:
握りつぶしたいときはどうしたらいいのでしょうか?
私はcatchで握りつぶしてしまってます…。


 間違いました。

 チェックすれば発生させずに済ませられる例外を、発生させて握りつぶしてはいけません。
…なんか、まだ考えを適切に表現できていないように思うので、突っ込んでください(反応鈍いですが)。




質問者の提示したコードに関して、ということだったのですね。
読解力不足。
お騒がせしてすみませんでした。

#例外を握りつぶす違う方法があるのかとおもってドキドキしてしまいました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-03-04 07:14
On Error Goto のことが書いてあったので、「それと同じに扱っちゃダメよ」…でよかったですね。
こちらこそすみません。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2008-03-04 08:02
NAL-6295です。

蛇足ですが、VisualStudio2005以降であれば、

tryf+[tab]でtry-catchではなくtry-finallyが生成されますので、楽ですよ。

引用:

むやみやたらとキャッチするのは、ハンドで反則です(by NAL-6295さん)。


一応紹介されていたので、リンクを貼っておきます。
http://d.hatena.ne.jp/NAL-6295/20050909/p1

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2008-03-04 08:04 ]
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2008-03-04 16:08
こんにちは。

多くの方々、ありがとうございます。
この件でもう少しお聞きしたいことがあります。

とにかくエラー処理は
Tryを使おうと思いますが

Private Sub Form_Load
Try
Call INIファイルREAD処理
Call ASyori
Catch ex As Exception
MsgBox("エラー")
End Try
End Sub
'****
Private Sub ASyori()
Try
処理
Catch ex As Exception
MsgBox("エラー")
End Try
End Sub

と書いた場合ASyoriで Catch ex As Exception
を書いている為ASyoriでエラーが起こった場合
エラーの記述がダブります。

でもINIファイルREAD処理の中で
Try文を書いていなかったら
Form_LoadのTry文に引っかかります。

このような書き方は皆さんは
しないのでしょうか?





まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2008-03-04 16:36
引用:

Private Sub Form_Load
Try
Call INIファイルREAD処理
Call ASyori
Catch ex As Exception
MsgBox("エラー")
End Try
End Sub
'****
Private Sub ASyori()
Try
処理
Catch ex As Exception
MsgBox("エラー")
End Try
End Sub

と書いた場合ASyoriで Catch ex As Exception
を書いている為ASyoriでエラーが起こった場合
エラーの記述がダブります。



ダブルというのは結果論です。>そう設計したのだから。
MsgBoxはユーザー対話インターフェースです。
要はUI処理と業務ロジックを適切に分離する必要があると思います。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2008-03-04 16:46
引用:

このような書き方は皆さんは
しないのでしょうか?



何をどうしたいかに拠ります。
どこで発生した例外をどこでどうしたいのか、
それに拠って。

例外処理が二重になったり、
ユーザーにプロンプトしたり
再スローしたり、
握りつぶしたり、
いろいろです。

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