throw e;(へぼろっぱぁ)より:
定期的に各所ででてくるお話ですが throw e; はやめましょうね、ホントに。
まぁ、あれですよ。Try と入力すると、Catch が自動入力されるのが、そもそもの間違いなんです。
あれ?あれれれれ???
むはっ!!!勘弁してください→Visual Basic 言語リファレンス / Throw ステートメント
- expression
- 必ず指定します。スローする例外に関する情報を指定します。
これですよ、これ。マイクロソフトの説明が、そもそも間違っているんですよorz
正しくは、こっち→Throw ステートメント (Visual Basic)
- expression
- 必ず指定します。スローする例外に関する情報を指定します。Catch ステートメント内では省略可能です。
Catch ステートメント内では省略可能です。
Catch ステートメント内では省略可能です。
Catch ステートメント内では省略可能です。
なお、C# の方は、旧 MSDN ライブラリでもcatch 句に現在の例外オブジェクトを再びスローするときは省略されます。
と書かれています。…なんか、変な日本語だけど、まぁ、よしとする。
………うわ!だめだぁ~~!!C# は、新 MSDN ライブラリの方がダメダメですよ!!→try-catch (C# リファレンス)
throw ステートメントは、catch ステートメントでキャッチされた例外を再びスローするために catch ブロックで使用できます。次に例を示します。
catch (InvalidCastException e)
{
throw (e); // Rethrowing exception e
}
パラメータのない catch 句で処理された例外を再スローする場合、引数のない throw ステートメントを使用します。次に例を示します。
catch
{
throw;
}
『C# 言語仕様』の方には、ちゃんと書いてありますね。
8.9.5 The throw statement より:
A throw statement with no expression can be used only in a catch block, in which case that statement re-throws the exception that is currently being handled by that catch block.
ちょうどいいや。ここで宣伝。
新しい msdn ライブラリでは、各ページの下の方に「コミュニティ コンテンツ」というところがあります。このコミュニティ コンテンツは、Windows Live ID を持っている方なら誰でも、そのページの内容に関係のある事柄を書き込むことができます。
“関係のある事柄”といっても、「この意味がわからない。」「これって、具体的にどう使うの?」といった質問に関しては、MSDN フォーラム他でお尋ねください。
そういった質問ではなく、「ここ、誤訳でしょ。正しくは、こう!」とか、「ここでされている説明って、間違ってますよね。実際にはこう動きますよね。」とか、「これって、使い道があまりなさそうですが、こんな風に使ってください。」とか、「よく間違って使っている例を見ますが、こんな風に使いましょう。」など、他の人への提案を書き込んでください。
とはいえ、MVP を中心としたモデレータが、24時間態勢で(<おいっ!!)見回り、適切な誘導をしますので、感覚がつかめるまでは遠慮無く書き込んでください。
閑話休題
まぁ、ね。あれですよ。そもそもの原因は try と入力したら catch ブロックが挿入されることですよ。これが、finally だったら、誰も再スローしようなんて思わないのですから。
かつ、.NET Framework では「検査例外」は無いのですから、ほとんどの場合は try - finally で良いのです。いっそのこと、「try - catch 使うな。try - finally 使え。」ってことで、キャンペーン打ってみてはいかがでしょう?
投稿日時 : 2007年6月8日 22:07