none
例外発生時のメッセージ(文言)の取得 RRS feed

  • 質問

  • 例外が発生した場合のメッセージの文言を取得したいのです。

     

    System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection();
    cn.Open();

     

    例えば、このソースを実行すると、

    System.InvalidOperationException の例外がThrowされ、メッセージとして

     

    "ConnectionString プロパティは初期化されていません。"

     

    と表示されます。

     

    この「"ConnectionString プロパティは初期化されていません。"」というメッセージ(文言)自体

    をどこからか取得ってできないでしょうか?

     

    constを1つ作ればそれで済む話なのですが、どこからか取得できるのであれば、そちらから

    取得しようかと思いまして。

     

    .Netに内包されていて、取得ってできないですかね?

     

    ご教授の程、宜しくお願い致します。

     

    2008年3月12日 5:35

回答


  • ①最初に文字列が入ったアセンブリを探します。

    (探し方は例えば、Reflectorツールなどを利用してアセンブリ内のリソース文字列(英語です)を確認します)

    ②リソース文字列の階層とIDをメモリます。

    ③ResourceManagerを作成するときにその階層とアセンブリを指定します

    ④GetString時にIDを指定すれば取得できます。(自動的に日本語になります)


    ※簡単に言えばどのアセンブリのどの階層のIDがどれかです。
    2008年3月13日 2:14

すべての返信

  • ExceptionクラスのMessageプロパティを参照すればよいのでは?

     

    2008年3月12日 5:45
  • GX999さん、回答ありがとうございます。

     

    >ExceptionクラスのMessageプロパティを参照すればよいのでは?

    発生した例外を catch し、そこでMessageプロパティを参照する、という事でしょうか?

     

    発生した例外からメッセージを取得したいのではなく、自前で例外を Throw する際の

    メッセージとして、どこかしらから取得したい、と。

     

    "ConnectionString プロパティは初期化されていません。"

     

    この文言については、.Netがもっているので、同じ文言のメッセージ(のconst)を

    自前で持つよりも、.Netから取得できるのであれば、そこから取得したいな、

    というのがやりたい事です。

     

    2008年3月12日 6:47
  • あぁ、意味が分かりました。(^_^;

     

    定義はされていますが、privateな定数ですから、外部からは参照できません。

     

    独自の例外クラスを作成する場合、Exceptionクラスを継承して作成することになります。その内部で表示するメッセージはそのクラス内で定義します。

     

    2008年3月12日 6:55
  • アセンブリからリソースを取得することは可能ですが。(ResourceManager辺り)

     

    同じメッセージを出力するのはどうでしょうか?

     

    (同じなら同じなので同じ:意味わからん)

    2008年3月12日 8:07
  • indigo-xさん、回答ありがとうございます。

     

    >アセンブリからリソースを取得することは可能ですが。(ResourceManager辺り)

     

    リソースファイルからリソースを取得する

    http://dobon.net/vb/dotnet/programing/resourcemanager.html

     

    この辺りを参考にやってはみたのですが、ResourceManager.GetString() なり、

    ResourceManager.GetObject() なり、引数として、どういった文字列を渡せば

    良いのか分からなくて。

     

    何を渡せば良いか、どの様にしたら分かりますでしょうか。

     

    2008年3月12日 23:57

  • ①最初に文字列が入ったアセンブリを探します。

    (探し方は例えば、Reflectorツールなどを利用してアセンブリ内のリソース文字列(英語です)を確認します)

    ②リソース文字列の階層とIDをメモリます。

    ③ResourceManagerを作成するときにその階層とアセンブリを指定します

    ④GetString時にIDを指定すれば取得できます。(自動的に日本語になります)


    ※簡単に言えばどのアセンブリのどの階層のIDがどれかです。
    2008年3月13日 2:14
  • 無事、取得できました。

     

    ただ、(4)で渡すIDは(2)で取得したもの、つまり、処理の流れ的にはほぼ決め打ちで

    取得する形になりますね。

    結局、この「ID」が変化してしまえば、そのまま取得できなくなり、「柔軟的に」とは

    いかないですね。

     

    せっかく、取得方法を示して頂いたのですが、素直に内部でconst文を持ちます。

     

    ありがとうございました。

     

    2008年3月14日 2:59