- PR -

innerExceptionの種類で処理を分けたいのですが・・・

投稿者投稿内容
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2008-07-16 20:32
 お世話になっております。
VB2005 + .net Framework2.0 で開発し始めました。

 自分で立てたwebサーバー上にテキストファイルを公開しております。
クライアントPCからDownloadFile()を使ってそのファイルをダウンロードできております。

 このたび、例外処理で
サーバーに接続できない時と
ファイル名が間違っている時で
別々の処理を行いたいと思っておりますが、
どちらでも

Catch ex As Net.WebException

で処理されてしまいます。

ファイル名が間違っているときはそれで合っているのですが、
サーバーに接続できない状態を作ってウォッチウィンドウで見てみると

Net.WebException

のinnerException が System.Net.Socket.SocketException
となっておりました。

innerException の System.Net.Socket.SocketException
を補足するにはどうすればよいでしょうか。

あるいは別の方法があれば是非ともご教授たまわりたいと思います。




==========================================================================

Private Sub DownloadTest(ByVal DownloadKey As String, ByVal SaveDir As String)
Try
Dim Internet As Net.WebClient = New Net.WebClient()
Dim URL As String = "http://でたらめサーバー名/正しいファイル名.txt"
'Dim URL As String = "http://正しいサーバー名/でたらめファイル名.txt"
Dim FileName As String = SaveDir & "\\\\test.txt
Dim strLine As String
Internet.DownloadFile(URL, FileName)

Catch ex As Net.Sockets.SocketException
'ここを通ることがない
Throw New Net.WebException("サーバーに接続できませんでした。")
Catch ex As Net.WebException
'Message : "リモート サーバーがエラーを返しました: (404) 見つかりません"
Throw New Net.WebException("入力されたキーは無効です。")
Catch ex As Exception
Throw
End Try

End Sub
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2008-07-16 22:45
catch節の中で場合分けすればヨクネ?
コード:
Try

Catch x As Net.WebException 
    If x Is SocketException Then

    Else

    End If
End Try


ってな感じ?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2008-07-16 23:14
引用:

かずくんさんの書き込み (2008-07-16 22:45) より:
catch節の中で場合分けすればヨクネ?
コード:

Try

Catch x As Net.WebException
If x Is SocketException Then

Else

End If
End Try


ってな感じ?


VBだとこんなのも
コード:

Try

Catch ex As Net.WebException When TypeOf ex.InnerException Is SocketException

End Try




[ メッセージ編集済み 編集者: なちゃ 編集日時 2008-07-16 23:17 ]
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2008-07-16 23:34
ご返信ありがとうございます。

Importをしていませんでしたので、Net.Sockets. を追加して

Try

Catch x As Net.WebException
If x Is Net.Sockets.SocketException Then

Else

End If
End Try

でやってみましたが、

「'SocketException'は'Sockets'では型です。式として使用することはできません。」
と言われました。。検証方法がまずかったでしょうか・・・
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2008-07-16 23:57
TypeOf が抜けてますね(xの前に)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-07-17 07:09
if (x.InnerException != null) {
if (typeof x.InnerException is ...

じゃない?
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2008-07-17 08:19
Jitta様、なちゃ様、かずくん様

ご教授ありがとうございました。解決いたしました!

McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2008-07-18 00:13
 何度もすみません。。
同じプログラムの中でもう一つ質問させてください。

Catch ex As Net.WebException
'Message : "リモート サーバーがエラーを返しました: (404) 見つかりません"
Throw New Net.WebException("入力されたキーは無効です。")

の部分で、HttpWebResponseの種類(404エラーなど)によっても少し処理を分けたい事情が発生いたしました。

Catch ex As Net.WebException

の部分にブレイクポイントを設けて、exにマウスを当てて404エラーが格納されている階層を探りましたら以下のようでした。

[-]ex
 +Data
 |・・・
 +Response  |{System.Net.HttpWebResponse}
  +System.Net.HttpWebResponse
   |
   |・・・
   |
   ├StatusCode     | Not Found {404}
   └StatusDescription | "Not Found"


そこでStatusCodeを比較判定すればよさそうだと思い次のように書いたらコンパイルが通りませんでした。


Catch ex As Net.WebException
if ex.Response.StatusCode = 404 Then
'404エラー処理
elseif ex.Response.StatusCode = *** Then
'***エラー処理

・・・

end if


そもそも Response. と打った時点で StatusCode がエディタの補完リストに出てこなかったので駄目だとは思ったのですが、やろうとしていることは伝わるのではないかと思い、無理やり書きました。

 +Response  |{System.Net.HttpWebResponse}
  +System.Net.HttpWebResponse

のような階層に出くわしたときに、どのように書けばStatusCodeにたどり着くのでしょうか、何卒ご教授くださいますようよろしくお願い致します。

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