- - PR -
innerExceptionの種類で処理を分けたいのですが・・・
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-07-18 01:35
こんな感じですかね?
少なくともビルドが通るところまでは確認しました。(***を書きなおせばですが。) | ||||||||
|
投稿日時: 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を使えばいい!」という結論にたどりつくのでしょうか。 | ||||||||
|
投稿日時: 2008-07-22 17:17
逆に、CTypeを付けずにコンパイルしてみればいい。
ってな感じで。 コンパイラの語る内容に耳を傾ければ、おのずと理解できるようになるでしょう。 | ||||||||
|
投稿日時: 2008-07-22 18:52
かずくん様
ご教授ありがとうございました。 確かにコンパイラの言うとおりでした。 | ||||||||
|
投稿日時: 2008-07-24 22:03
catch ブロックの中で別の例外に書き換えるのはいいのだけれど、せめて InnerException に、今発生している例外を格納して欲しい。。。
あと、Exception.Message には、“開発者向けの”メッセージを設定し、エンド ユーザ向けのメッセージは仕込まないようにしましょう。 意図しないことで発生するのが例外です。この情報の中には、エンド ユーザに見せてはいけない情報も含まれます(スタック トレースなど)。特にウェブ アプリケーションでは、SQL Injection の糸口を与えることになる、データベースからのエラーメッセージを見せてはいけません。こういった情報を隠す/見せるを判断するのではなく、例外情報は隠し、安全なメッセージだけを表示するようにデザインしましょう。 ご参考:例外のデザインのガイドライン<microsoft.com> | ||||||||
|
投稿日時: 2008-08-04 11:50
Jitta様 お世話になっております。
ガイドラインを読ませていただきました。 大変勉強になりました。ありがとうございます。 |