- PR -

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

投稿者投稿内容
まりも
ベテラン
会議室デビュー日: 2006/08/19
投稿数: 77
投稿日時: 2008-07-18 01:35
こんな感じですかね?

コード:
        Catch ex As Net.WebException
            If CType(ex.Response, System.Net.HttpWebResponse).StatusCode = 404 Then
                '404エラー処理 
            ElseIf CType(ex.Response, System.Net.HttpWebResponse).StatusCode = *** Then
                '***エラー処理 



少なくともビルドが通るところまでは確認しました。(***を書きなおせばですが。)
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2008-07-22 14:47
 ご回答、ご教授ありがとうございました!
うまく動きました。

 さて、うまくはいったのですが、なにぶん.Netを始めたばかりですので何故うまくいったのかがわからずにおります。もしよろしければ初心者の素朴な疑問にお付き合いいただければと思います。

 まず

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

はよくわかります。型と型を比較して真かどうかを評価してします。

 しかし

CType(ex.Response, System.Net.HttpWebResponse).StatusCode = ***

の場合は

 エラーが発生した時点でex.Responseというオブジェクトのどこかに404という情報は既に格納されていると私は信じています。
なのに、CTypeで型を変換しないと404情報が格納されている場所にたどり着けない理由がよくわかりません。(もともと何らかの形でex.Responseの中に404情報があるはずでは・・・)

 確かにヘルプを見ると

継承階層
System.Object
 System.MarshalByRefObject
  System.Net.WebResponse
   System.Net.HttpWebResponse

となっていますし、サンプルでも同じようにCTypeされていました。

Visual Basic コードのコピー
Dim HttpWReq As HttpWebRequest = _
CType(WebRequest.Create("http://www.contoso.com"), HttpWebRequest)

Dim HttpWResp As HttpWebResponse = _
CType(HttpWReq.GetResponse(), HttpWebResponse)
' Insert code that uses the response object.
HttpWResp.Close()


どうすれば「CTypeを使えばいい!」という結論にたどりつくのでしょうか。


 
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2008-07-22 17:17
引用:

McLarenさんの書き込み (2008-07-22 14:47) より:

どうすれば「CTypeを使えばいい!」という結論にたどりつくのでしょうか。


逆に、CTypeを付けずにコンパイルしてみればいい。
コード:
e.Response.StatusCode = ***


ってな感じで。

コンパイラの語る内容に耳を傾ければ、おのずと理解できるようになるでしょう。

McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2008-07-22 18:52
かずくん様

ご教授ありがとうございました。
確かにコンパイラの言うとおりでした。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-07-24 22:03
 catch ブロックの中で別の例外に書き換えるのはいいのだけれど、せめて InnerException に、今発生している例外を格納して欲しい。。。
コード:
Catch ex As Net.WebException
    'Message : "リモート サーバーがエラーを返しました: (404) 見つかりません"
    Throw New Net.WebException("入力されたキーは無効です。", ex)



 あと、Exception.Message には、“開発者向けの”メッセージを設定し、エンド ユーザ向けのメッセージは仕込まないようにしましょう。
 意図しないことで発生するのが例外です。この情報の中には、エンド ユーザに見せてはいけない情報も含まれます(スタック トレースなど)。特にウェブ アプリケーションでは、SQL Injection の糸口を与えることになる、データベースからのエラーメッセージを見せてはいけません。こういった情報を隠す/見せるを判断するのではなく、例外情報は隠し、安全なメッセージだけを表示するようにデザインしましょう。

ご参考:例外のデザインのガイドライン<microsoft.com>
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2008-08-04 11:50
 Jitta様 お世話になっております。
ガイドラインを読ませていただきました。
大変勉強になりました。ありがとうございます。

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