- PR -

C#でException.HResultを取得したい

投稿者投稿内容
ジロボット
常連さん
会議室デビュー日: 2004/02/29
投稿数: 40
投稿日時: 2005-10-21 16:58
C#で例外処理をしたときに、Exception.HResultの値を取得したくて
以下のような派生クラスを作り、Exceptionのかわりに使用したところ
Exceptionではキャッチしてくれた例外を捕まえてくれなくなりました
下記の実装に問題があるのでしょうか?
よろしくお願いします

public class ExceptionWithErrorCode : System.Exception
{
  public ExceptionWithErrorCode()
  {
  }
  public int ErrorCode
  {
    get
    {
      return this.HResult;
    }
  }
}
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-21 17:35
引用:

ジロボットさんの書き込み (2005-10-21 16:58) より:

以下のような派生クラスを作り、Exceptionのかわりに使用したところ
Exceptionではキャッチしてくれた例外を捕まえてくれなくなりました


今まで Exception でキャッチしてくれた例外についてキャッチできないのは当たり前だと思うのですが...
Exception の例外ハンドラも追加してください。

コード:

    private void button1_Click(object sender, System.EventArgs e) {
        try {
            throw new ExceptionWithErrorCode();
            //throw new NullReferenceException();
        } catch (ExceptionWithErrorCode ex1) {
            MessageBox.Show(ex1.ErrorCode.ToString());
        } catch (Exception ex2) {
            MessageBox.Show(ex2.ToString())
        }
    }


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ジロボット
常連さん
会議室デビュー日: 2004/02/29
投稿数: 40
投稿日時: 2005-10-21 18:36
じゃんぬねっとさん、お返事ありがとうございます

そうなんですか。うーん。困りました

教えて頂いたコードの ex2 の HResult はどうすれば取得できるでしょうか?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-10-21 18:41
どうしてもってことなら、Reflection を使ってみるとか。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
ジロボット
常連さん
会議室デビュー日: 2004/02/29
投稿数: 40
投稿日時: 2005-10-21 18:57
渋木宏明(ひどり)さん、お返事ありがとうございます。

Reflection 使うというのはどういうことでしょうか?

.NET Framework 用語集 に

reflection 【リフレクション】
アセンブリとそのアセンブリ内で定義される型についての情報を取得し、実行時に型のインスタンスを作成し、呼び出し、アクセスするプロセス。

とありましたが何のことだか(涙。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-10-21 20:32
引用:

Reflection 使うというのはどういうことでしょうか?



System.Reflection 名前空間配下のクラスや定義を使用するということです。

コード:
Exception x = new Exception();

PropertyInfo info = x.GetType().GetProperty ("HResult", BindingFlags.Instance|BindingFlags.NonPublic);
object value = info.GetValue (x, new object[] {});

int hr = (int) value;
System.Console.WriteLine ("HRESULT = "+ hr.ToString ("X"));


ジロボット
常連さん
会議室デビュー日: 2004/02/29
投稿数: 40
投稿日時: 2005-10-22 02:55
渋木宏明(ひどり)さん、お返事ありがとうございます

教えて頂いたソースで、取得できました
(じつは何をやっているのかまだわかっていないので、おいおい勉強していきます)

ありがとうございました
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-10-22 04:54
ちなみに、どうして Exception.HResult が必要なんでしょう?

COMException を catch して、COMException.ErrorCode を見れば済んでしまったりはしませんか?

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