2011-01-20 32 views
1

C++では、裸の文字列を例外として投げることができますが、C#ではExceptionを投げる必要があります。 C#で文字列を投げるのと同等のC#は何ですか?C++/C#例外スロー

例えば、C++ではthrow "something bad happened"とすることができます。 Cでこれは.....だろうか?

+1

私はそれに答えることができますが、それは単に文字列を投げているだけです。 –

+0

あなたの質問は意味をなさない – Divi

+0

C++では、 'throw 'を行うことができますか?これはエラー"; "で、C#と同等です。 –

答えて

6

質問はかなり不明ですが、問題は「C++では文字列を投げることができますが、C#はどうですか?」

C#では、C++での処理と同様の方法で例外をスローします。主な相違点は、System.Exceptionから派生したクラスだけを投げることができますが、C++では任意の型を投げることができます(std::exceptionから派生したクラスだけを投げることが推奨されることもありますが、 C++で)。

C#で、単にいくつかのランダムを言って...、System.Exceptionはそこではなく、例外をスローするための最も一般的な理由(ArgumentOutOfRangeExceptionInvalidOperationExceptionを記述する様々な派生クラスのトラック輸送があります、OverflowExceptionことに注意してください)これにより、問題のタイプを表現するより良い方法が得られます(タイプはcatchブロックで区別できます)。また、カスタムエラー文字列をコンストラクタ。これは単に文字列を投げるよりもはるかに優れています。なぜなら、例外が "012"の最大値まで "バブル"して、多かれ少なかれ問題をログに記録して終了することができるからです。それでも、一般的なSystem.Exceptionを捕まえて、エラー文字列

これはC++でも可能ですが、既成の派生例外(<stdexcept>)は.NET Frameworkで提供される例外よりもはるかに小さいことに注意してください。

もう1つの重要な違い(C++から来ている)は、C++ではスローに由来するスタックの巻き戻しがローカルオブジェクトを即座に破棄する(概念はRAIIを構築しています)、C#では破壊は非決定的ですそれらを指し示す瓶が範囲外になった後はいつでも)。このような場合にはすぐにリリースしなければならないクラスを持つことが重要です。IDisposableインターフェイスを実装し、usingブロックを使用してください。

+0

C#にusing句を追加して、決定的に破壊(または破棄)する理由は何ですか? –

+0

C++からC#への変換では、プリミティブ型を投げるのに最も便利なのは何ですか? – lexeme

+0

強く型付けされた例外をどのように投げて、System.Exceptionを投げてはいけないのかを少し追加すれば、私から+1が得られます。 – Neil

1

C#では、Exceptionクラスから派生したオブジェクトのみをスローすることができます。 CLR自体も他の型をスローすることができます。もし本当にしたいのであれば、文字列を他の言語やILに直接スローするメソッドを書くことができるはずです。 C#で文字列例外としてキャッチすることはできません(例外タイプのない「キャッチ」を持つ未知の例外としてのみ)。

あなたの目標に応じてthrow new Exception("My string here");で十分でしょう。 編集(ありがとうNeil):ただし、一度だけ実験を中止しない限り、独自の例外を作成する必要があります。

+2

-1いいえいいえいいえいいえhttp://msdn.microsoft.com/en-us/library/ms173163.aspx System.Exceptionをスローしないでください。例外については、呼び出し元のコードがエラーを検出できるようにスローします。一般的な例外をスローすると、コード内で起こった可能性のあるさまざまな処理を行うことができなくなります。 – Neil