- PR -

ArgumentException,ArgumentNullExceptionでパラメータ名とメッセージを入力したときメッセージだけ取り出

投稿者投稿内容
もとべえ
会議室デビュー日: 2004/09/17
投稿数: 16
投稿日時: 2005-06-30 13:07
ArgumentExceptionとArgumentNullExceptionを発生させるときパラメータ名とメッセージを入力すると思いますが、それを受け取ったときにメッセージの中はパラメータ名とメッセージが一緒になった形になってしまっています。
(メッセージ。パラメータ名「      」という書式になっています)
その中から指定したメッセージ名だけを取り出すのに便利な方法はありますか?

もちろんパラメータ名を指定しなければいいと言う方法もありますが、今回はなるべく原因となるパラメータ名を残しておいて、その中からコメントだけを抽出し、ダイアログ等で表示したいと思っております。

パラメータ名だけであれば、そのようなプロパティがあるようなのですが、メッセージだけというのはありません。やはり自分で派生して作るしかないのでしょうか?
もし派生しなくても済みそうな方法があれば、お教え下さい。


[ メッセージ編集済み 編集者: もとべえ 編集日時 2005-06-30 13:08 ]

[ メッセージ編集済み 編集者: もとべえ 編集日時 2005-06-30 13:13 ]
餅宮餅吉
ベテラン
会議室デビュー日: 2005/03/04
投稿数: 57
お住まい・勤務地: 月餅のうまい店の隣
投稿日時: 2005-06-30 17:00
もとべえさん、こんにちわ

C#で試した見たら、パラメータとメッセージの間に改行コードが入っているようなので、
これを基準に取得してみは如何でしょうか?
#あまり、きれじゃないけど。。。
#あと、ArgumentException、ArgumentNullExceptionの引数の内容が違うのが気持ち悪い。
#プレビューの度に¥が増えてゆく。何かの制限だろうか?

以下、ためしてみたソース
public static void Main(string[] args) {
try {
throw new ArgumentException("エラー1", "項目名1");
} catch (ArgumentException ex) {
Console.WriteLine("□通常メッセージ\n" + ex.Message);
Console.WriteLine("□メッセージのみ取得\n" + ex.Message.Substring(0, ex.Message.LastIndexOf("\n")));
}
try {
throw new ArgumentNullException("項目名2", "エラー2");
} catch (ArgumentNullException ex) {
Console.WriteLine("■通常メッセージ\n" + ex.Message);
Console.WriteLine("■メッセージのみ取得\n" + ex.Message.Substring(0, ex.Message.LastIndexOf("\n")));
}
}

実行結果
□通常メッセージ
エラー1
パラメータ名 : 項目名1
□メッセージのみ取得
エラー1
■通常メッセージ
エラー2
パラメータ名 : 項目名2
■メッセージのみ取得
エラー2
もとべえ
会議室デビュー日: 2004/09/17
投稿数: 16
投稿日時: 2005-06-30 17:05
餅宮餅喜さん。レスありがとうございます。

なるほど、改行で区別するというのは、1つの方法としてありだと思いました。
ありがとうございます!

なぜパラメータ名は簡単に取得できるのに・・・。メッセージもプロパティにしてくれなかったのでしょうね・・・。
えんぞ@?
ぬし
会議室デビュー日: 2004/07/06
投稿数: 271
お住まい・勤務地: はまっこ
投稿日時: 2005-06-30 17:40
回答ではなく、素朴な疑問なのですが、
 1.そもそもExceptionが発生しないような作りにしなければいけないのでは?
 2.例えExceptionが発生したとしても、その内容をアプリの使用者に通知するのに意味があるのか?
(ユーザへは簡易的なメッセージのみを表示し、Exceptionはログとして収集しフィードバックさせるとか)

# 「ダイアログ等で表示」って...違和感を感じてしまう。(^^;
もとべえ
会議室デビュー日: 2004/09/17
投稿数: 16
投稿日時: 2005-06-30 18:04
えんぞ@?さん。こんにちは!レスありがとうございます。

1.そもそもExceptionが発生しないような作りにしなければいけないのでは?

確かに発生しないような作りにしなければいけないのですが、ArgumentExceptionは引数のエラーのためにある例外ですし、ArgumentOutOfRangeExceptionに関しては引数の値が範囲外のもののための例外だと思っていますので、自分で制作したクラスから発生させたこれらの例外をせっかくなので、エラーメッセージの表示にも使えないかと考えた訳です。複数のクラスで、同じようなチェックをしているとスマートでもないと思ったからで・・・。


2.例えExceptionが発生したとしても、その内容をアプリの使用者に通知するのに意味があるのか?

例えば、引数の範囲が違った場合、エラーメッセージに「…から…の間だの値を設定してください」というエラーを自分が作成したクラスがthrowしたとき、そのまま表示させられればと思った訳です。

もちろん自分で制作したクラスでなければ、えんぞ@?さんのいうとおりにしています。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-06-30 19:11
引用:

ArgumentExceptionとArgumentNullExceptionを発生させるときパラメータ名とメッセージを入力すると思いますが、それを受け取ったときにメッセージの中はパラメータ名とメッセージが一緒になった形になってしまっています。
(メッセージ。パラメータ名「      」という書式になっています)
その中から指定したメッセージ名だけを取り出すのに便利な方法はありますか?


 Exception.Message を、エンドユーザに見せないような作りにすることを薦めます。

 このスレッドで延々と議論されていたのですが、 .NET Framework における例外は、プログラムを終了させるようなものになります。
 ArgumentExpcetion 系の例外も、プロパティやメソッドの引数が異常なのですから、エンドユーザが直接それらをどうこうすることはできないはずです。または、入力が NULL (または空文字列)だからというのであれば、それは例外で通知するのではなく、前もって検査するのが、 .NET での“流儀”になります。もとい、なるそうです。
 そのようにコーディングしてなおかつ Exception のメッセージがエンドユーザに通知されてしまうなら、それはエンドユーザを通して開発者に通知されるべきメッセージで、それであるなら、 Message プロパティがそのままもらえる方がよいのではないでしょうか。

_________________
もとべえ
会議室デビュー日: 2004/09/17
投稿数: 16
投稿日時: 2005-06-30 20:18
Jittaさん。レスありがとうございます。

議論が行われたスレッドを拝見いたしました。.NET Framework における例外は、プログラムを終了させるようなものになりますということも、.NET での“流儀”も納得しました。

私自身も自分で制作したクラスでなければ、プログラマに通知するメッセージだとして処理していますので、納得のいくところです。本来は自分のクラスに対策もそうすべきなのでしょう。

ただ、名前や住所などの情報を格納して何かをしようとするオブジェクトがあったときに、名前や住所の各メソッドやプロパティを呼び出すのに1つ1つtry-catchでくくって「名前が不正です。」「住所が不正です。」とするのがプログラムが長ったらしくなっていやだったので、短くしたい、まとめたいということも背景にありました。

にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-07-01 08:41
> 名前や住所の各メソッドやプロパティを呼び出すのに1つ1つtry-catchでくくって
でなく、「呼び出す」前に調べてから使うっていうのが「流儀」だそうです。

たとえば、bool IsValidAddress, IsValidName, ... を実装するとか。

個人的な印象:
例外時の詳細な情報を返したいのであれば、例外文字列をパースするよりも
専用の例外クラスを作ってそれを返すほうがいいと思います。

[ メッセージ編集済み 編集者: にしざき 編集日時 2005-07-01 08:52 ]

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