- - PR -
Exceptionの内容について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-15 17:54
いつも勉強させていただいております。
エラーが起こった際の、詳細なエラー内容についてですが、 現在、関数内で try{ 処理内容 } catch(Exception ex) { ErrorLogCreate(ex.ToString()); return; } とし、エラーが起こった際は、ErrorLogCreateという関数で エラーに吐き出すようにしておりますが、エラーの内容を 読むと System.FormatException: 入力文字列の形式が正しくありません。 at System.Number.ParseDouble(String s, NumberStyles style, NumberFormatInfo info) at System.Double.Parse(String s, NumberStyles style, IFormatProvider provider) at System.Double.Parse(String s) というような内容になっております。 (上の例は数値でない値をDoubleに変換しようとして 起こったエラーです。) ここで、どのような変数の値によりエラーが起こったのを知りたいのですが、 catchの中で明示的に記述しなければ拾えないものなのでしょうか? 何か良いエラー内容の取得の方法等ございましたら、 よろしくご教授お願いします。 | ||||||||||||
|
投稿日時: 2005-12-15 18:16
こんにちは。
Double に変換する所で、FormatException を処理して、ArgumentOutOfRangeException を投げる、とかですかね。 ところで、Exception を catch して、そこで例外をなかった事にしてしまっていいのですか? _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2005-12-15 18:36
それだと明示的に記述が必要になりませんか? 質問者さんの意図と違うような気がします。
とあります。 明示的に記述したくないということでしょう。 リフレクションを使っても、ローカル変数の値までは見れないような... クラスのフィールドであれば、GetValue で見れそうなのですが。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2005-12-15 18:39
ん〜、駄目だったかな。 投げる例外が ArgumentOutOfRangeException だと、
ここで、メッセージが「入力形式が変。実際の値は hogehoge です。」みたいなメッセージになるからよいかと思ったんですが。
みたいな。 おっと、s が引数じゃなかったら変ですね。 _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2005-12-15 18:44
囚人さんご返答ありがとうございます。
関数の内容を鑑みてそれぞれに対応した例外を取得するように するということでしょうか?
この関数はDuble以外の数値を返さないようにしてますので、 処理自体は問題無いのですが、問題はどんな値が入ってきたか を確認したいので、このような質問をさせていただきました。 面倒くさがりと言えばそれまでなのですが、どの関数でも 使えるようなエラーログの取得方法があればと思って、 質問させていただきました。 やはり使用に応じた例外を取得するしかないのでしょうか? | ||||||||||||
|
投稿日時: 2005-12-15 18:55
じゃんぬねっと様、囚人様ご返答ありがとうございます。
じゃんぬねっと様のおっしゃる通りです。 CのPERRORのような感じのことができないかと思ったのですが・・・ (はっきり言ってCは素人ですのでご容赦ください。) 皆様は予想外の例外が発生した際に、その内容はどのように 取得していますでしょうか? | ||||||||||||
|
投稿日時: 2005-12-15 19:04
私が質問を読み違えていて勘違いしているかもしれません。
例外を取得する方で何とかしようとするんではなくて、例外を投げる方がしっかりした情報を投げたらよいだけだと私は考えます。
問題の関数が独自の例外を投げる(例えば、ArgumentOutOfRangeException )のは駄目なんですかね。Double.Parse() の例外をそのままスローしているから、はっきりした情報が取れないだけだと思います。
こういう事を申したのは、ログを取る事自体は良いのですが、どんな例外でもそこで潰すのはよくないだろう、と思うからです。 例えば、StackOverflowException なんて自前で処理はできないです。ここでログをはいて、例外を潰し、その関数を出た後、システムはどうなるでしょう?
例外は、予想しているものだけ処理できる。予想外は処理できない。なので予想外の例外は単純にそのメッセージを出力するしかないのではないでしょうか。 _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2005-12-15 19:15
C の __FILE__ マクロなどのようなことは .NET ではできません。 というより、デバッグ情報がないと基本的に何もできません。 (リフレクション レベルまででしょう)
想定外のものは想定できないだけにどうにもならないので、Application.ThreadException で後始末だけして強制終了ですよね。 事前に防げるもの (例にあるような Double.Parse) は事前に防ぎますし、 事前に防げないけれど想定できる例外は、例外処理を行います。 もし値が欲しいのであれば、明示的に記述して値をログ出力しますね。 普通はそんなに数が多くなるものではないですからね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |