C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 例外への対処(考え方)


(過去ログ 102 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■61012 / inTopicNo.1)  例外への対処(考え方)
  
□投稿者/ コーヒーブレイク (1回)-(2011/07/29(Fri) 11:57:15)

分類:[.NET 全般] 

いつもお世話になっています。

いまさらなんですが、VB2010で.net本格的にいじっています。
.net初心者(VB6は経験済み)として回答いただけると助かります。

[質問]
文字列の一部をチェックするのにVB6のようにLeft、あるいはMid
ではなくSubstringが用意されているのと、
Left等との違いとして文字数以上を引数に指定すると例外が発生
するとこまで理解しました。
ということでTry〜Catchを利用し、以下のようなコーディングを
し正常動作しているのですがIDE上でデバッグしていると例外が
発生しているのがどうしても気になっています。

ということで是非以下の中でどれがベターかを教えてください。
 1..netはそういうもの。 例外も処理していればOK。
 2.わかっているなら回避するべき。
 3.それ以外。
正解はないのかもしれませんが、今後の指標にしたいので
是非お聞かせいただければと思います。
初歩的な質問ですいません。

※以下コード例
説明:文字列が1文字の場合に例外が発生します。

Try
  If 文字列.Substring(0, 2).CompareTo("AA") = 0 Then
    処理1
  ElseIf 文字列.Substring(0, 4).CompareTo("BBBB") = 0 Then
    処理2
  Else
    処理3
  End If
Catch ex As Exception
  Return
End Try
引用返信 編集キー/
■61013 / inTopicNo.2)  Re[1]: 例外への対処(考え方)
□投稿者/ shu (890回)-(2011/07/29(Fri) 12:16:56)
2011/07/29(Fri) 12:17:06 編集(投稿者)
No61012 (コーヒーブレイク さん) に返信

『2.わかっているなら回避するべき。』ですかね。この中には1.とか3.の一部も含まれますね。
わかっていなければ回避出来ないのでTryをつけとくとか、ある例外発生時はすぐに知りたいので
あえてtryをしないとか。今回の場合は明らかに回避できるので、回避しておくべきだと思います。

> Try
>   If 文字列.Substring(0, 2).CompareTo("AA") = 0  Then
>     処理1
>   ElseIf 文字列.Substring(0, 4).CompareTo("BBBB") = 0 Then
>     処理2
>   Else
>     処理3
>   End If
> Catch ex As Exception
>   Return
> End Try

とりあえず、これは
if 文字列.StartsWith("AA") then
    処理1
ElseIf 文字列.StartsWith("BBBB") then
    処理2
Else
    処理3
End If

こう書けますね。

提示されたコードを残しつつ回避するなら

If 文字列.Length >= 2 AndAlso 文字列.Substring(0, 2).CompareTo("AA") = 0  Then
    処理1
ElseIf 文字列.Length >= 4 AndAlso 文字列.Substring(0, 4).CompareTo("BBBB") = 0 Then
    処理2
Else
    処理3
End If





引用返信 編集キー/
■61016 / inTopicNo.3)  Re[1]: 例外への対処(考え方)
□投稿者/ 魔界の仮面弁士 (2277回)-(2011/07/29(Fri) 12:52:21)
2011/07/29(Fri) 12:55:23 編集(投稿者)

No61012 (コーヒーブレイク さん) に返信
> 文字列の一部をチェックするのにVB6のようにLeft、あるいはMid
> ではなくSubstringが用意されているのと、

Left / Mid / Right も用意されていますよ。VB6 とまったく同じ構文で使えます。

ただし、Form 上から使うときは、フォームの Left プロパティと区別するために、
Strings.Left などと記述する必要があります。Module 等から使う場合は Left だけでも OK。
(VB6 でも、Left関数を「Strings.Left」や「VBA.Strings.Left」と記述できますね)


> Left等との違いとして文字数以上を引数に指定すると例外が発生
> するとこまで理解しました。

文字数以上を引数にしたいなら、そのまま Left を使い続けるのも手です。

指定する値を (VB6 のように)1ベースでは無く、(Substring のように)0ベースにしたいなら、
それに応じた Function を自作するという手もありますが。


> ということでTry〜Catchを利用し、以下のようなコーディングを
このような場合には Catch して処理するのではなく、文字列長を取得した上で
文字数以上が指定されないように、If 関数や If ステートメントで分岐処理すべきです。


>  1..netはそういうもの。 例外も処理していればOK。
NG です。その手の例外は Catch するのではなく、メソッド呼び出し前に値を検証すべきです。


>  2.わかっているなら回避するべき。
こちらですね。
ファイルIOエラーなどの、「実行時にしか判定できない例外」は Catch で良いですが、
 ArgumentOutOfRangeException (範囲外の値が引数に渡された場合)
 ArgumentNullException (参照型の引数に、不用意に Nothing 値が渡された場合)
 IndexOutOfRangeException (配列等のインデックスに要素数を超える値が指定された場合)
 NullReferenceException (参照型が Nothing の状態のまま、そのメンバーを呼び出そうとした場合)
などの例外については、そもそも Catch せずとも動作するように記述すべきかと。


>  3.それ以外。
別案で実装するのも手ですね。


> 説明:文字列が1文字の場合に例外が発生します。
文字列が長さゼロの文字列("") の場合の例外と、
文字列が Nothing の場合の例外が異なることにも注意してください。



> If 文字列.Substring(0, 2).CompareTo("AA") = 0 Then

「If 文字列 Like "AA*" Then」という手もありますし、あるいは
「If If(文字列, "").StartsWith("AA") Then」という手もあります。
引用返信 編集キー/
■61018 / inTopicNo.4)  Re[2]: 例外への対処(考え方)
□投稿者/ コーヒーブレイク (2回)-(2011/07/29(Fri) 13:10:26)
shu さん、魔界の仮面弁士 さん
さっそくの回答ほんとうにありがとうございます。


お二人とも基本的には「2.わかっているなら回避するべき。」
ということですね。

お二人の内容を見て、ほんとうにまだまだ勉強足らずだと
いうことがよくわかりました。
といってもいきなりお二人のレベルなんて望むべくもないわけで
コツコツがんばっていきます。
さしあたってこの回答いただいた内容を再度よく読んで理解し、
自分のものにしたいと思います。

今回はほんとうにありがとうございました。
これからもよろしくお願いいたします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -