- - PR -
innerExceptionの種類で処理を分けたいのですが・・・
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 | ||||||||||||
|
投稿日時: 2008-07-16 22:45
catch節の中で場合分けすればヨクネ?
ってな感じ? | ||||||||||||
|
投稿日時: 2008-07-16 23:14
VBだとこんなのも
[ メッセージ編集済み 編集者: なちゃ 編集日時 2008-07-16 23:17 ] | ||||||||||||
|
投稿日時: 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'では型です。式として使用することはできません。」 と言われました。。検証方法がまずかったでしょうか・・・ | ||||||||||||
|
投稿日時: 2008-07-16 23:57
TypeOf が抜けてますね(xの前に)
| ||||||||||||
|
投稿日時: 2008-07-17 07:09
if (x.InnerException != null) {
if (typeof x.InnerException is ... じゃない? | ||||||||||||
|
投稿日時: 2008-07-17 08:19
Jitta様、なちゃ様、かずくん様
ご教授ありがとうございました。解決いたしました! | ||||||||||||
|
投稿日時: 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にたどり着くのでしょうか、何卒ご教授くださいますようよろしくお願い致します。 |