- PR -

Exceptionの内容について

投稿者投稿内容
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 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/08/13
投稿数: 1019
投稿日時: 2005-12-15 18:16
こんにちは。

Double に変換する所で、FormatException を処理して、ArgumentOutOfRangeException を投げる、とかですかね。

ところで、Exception を catch して、そこで例外をなかった事にしてしまっていいのですか?

_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-15 18:36
引用:

囚人さんの書き込み (2005-12-15 18:16) より:

Double に変換する所で、FormatException を処理して、ArgumentOutOfRangeException を投げる、とかですかね。


それだと明示的に記述が必要になりませんか?
質問者さんの意図と違うような気がします。

引用:

ターキッシュさんの書き込み (2005-12-15 17:54) より:

ここで、どのような変数の値によりエラーが起こったのを知りたいのですが、
catchの中で明示的に記述しなければ拾えないものなのでしょうか?


とあります。
明示的に記述したくないということでしょう。

リフレクションを使っても、ローカル変数の値までは見れないような...
クラスのフィールドであれば、GetValue で見れそうなのですが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-12-15 18:39
引用:

それだと結局その時に応じた変数を指定することになり、
質問者さんの意図と変わっているような気がします。


ん〜、駄目だったかな。
投げる例外が ArgumentOutOfRangeException だと、
コード:
catch(Exception ex) 
{ 
ErrorLogCreate(ex.ToString()); 
return; 
} 


ここで、メッセージが「入力形式が変。実際の値は hogehoge です。」みたいなメッセージになるからよいかと思ったんですが。

コード:
try
{
	Double d = Double.Parse( s )
}
catch( FormatException e )
{
	throw new ArgumentOutOfRangeException( "s", s, "入力形式が変" );
}


みたいな。
おっと、s が引数じゃなかったら変ですね。
_________________
囚人のジレンマな日々
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2005-12-15 18:44
囚人さんご返答ありがとうございます。

引用:

Double に変換する所で、FormatException を処理して、ArgumentOutOfRangeException を投げる、とかですかね。



関数の内容を鑑みてそれぞれに対応した例外を取得するように
するということでしょうか?


引用:

ところで、Exception を catch して、そこで例外をなかった事にしてしまっていいのですか?



この関数はDuble以外の数値を返さないようにしてますので、
処理自体は問題無いのですが、問題はどんな値が入ってきたか
を確認したいので、このような質問をさせていただきました。

面倒くさがりと言えばそれまでなのですが、どの関数でも
使えるようなエラーログの取得方法があればと思って、
質問させていただきました。

やはり使用に応じた例外を取得するしかないのでしょうか?

ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2005-12-15 18:55
じゃんぬねっと様、囚人様ご返答ありがとうございます。

じゃんぬねっと様のおっしゃる通りです。
CのPERRORのような感じのことができないかと思ったのですが・・・
(はっきり言ってCは素人ですのでご容赦ください。)

皆様は予想外の例外が発生した際に、その内容はどのように
取得していますでしょうか?
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-12-15 19:04
私が質問を読み違えていて勘違いしているかもしれません。

例外を取得する方で何とかしようとするんではなくて、例外を投げる方がしっかりした情報を投げたらよいだけだと私は考えます。

引用:

この関数はDuble以外の数値を返さないようにしてますので、


問題の関数が独自の例外を投げる(例えば、ArgumentOutOfRangeException )のは駄目なんですかね。Double.Parse() の例外をそのままスローしているから、はっきりした情報が取れないだけだと思います。

引用:

ところで、Exception を catch して、そこで例外をなかった事にしてしまっていいのですか?


こういう事を申したのは、ログを取る事自体は良いのですが、どんな例外でもそこで潰すのはよくないだろう、と思うからです。

例えば、StackOverflowException なんて自前で処理はできないです。ここでログをはいて、例外を潰し、その関数を出た後、システムはどうなるでしょう?

引用:

皆様は予想外の例外が発生した際に、その内容はどのように
取得していますでしょうか?


例外は、予想しているものだけ処理できる。予想外は処理できない。なので予想外の例外は単純にそのメッセージを出力するしかないのではないでしょうか。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-15 19:15
引用:

ターキッシュさんの書き込み (2005-12-15 18:55) より:

じゃんぬねっと様のおっしゃる通りです。
CのPERRORのような感じのことができないかと思ったのですが・・・


C の __FILE__ マクロなどのようなことは .NET ではできません。
というより、デバッグ情報がないと基本的に何もできません。
(リフレクション レベルまででしょう)

引用:

皆様は予想外の例外が発生した際に、その内容はどのように
取得していますでしょうか?


想定外のものは想定できないだけにどうにもならないので、Application.ThreadException で後始末だけして強制終了ですよね。

事前に防げるもの (例にあるような Double.Parse) は事前に防ぎますし、
事前に防げないけれど想定できる例外は、例外処理を行います。

もし値が欲しいのであれば、明示的に記述して値をログ出力しますね。
普通はそんなに数が多くなるものではないですからね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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