例外処理でのthrowの使用について誰か説明してもらえますか?例外をスローするとどうなりますか?
5 に答える
これは、例外を「引き起こす」ことを意味します。例外を「スロー」すると、「問題が発生しました。詳細は次のとおりです」と言っています。
次に、「スローされた」例外を「キャッチ」して、プログラムがエラーや死に至るのではなく、正常に機能を低下させることができます。
例外の「スロー」は、例外処理のプロセス全体をトリガーするものです。
通常の実行では、プログラム内の行はループと分岐で順番に実行されます。ある種のエラーが発生すると、例外が作成されてスローされます。
スローされた例外は、例外がどこかの「catch」ブロック内で処理されるまで「通常の」命令が実行されないように、プログラムの通常の操作順序を変更します。例外がcatchブロックでキャッチされ、そのcatchブロック内のコードが実行されると(例外の「処理」)、通常のプログラム実行はcatchブロックの直後に再開されます。
// Do some stuff, an exception thrown here won't be caught.
try
{
// Do stuff
throw new InvalidOperationException("Some state was invalid.");
// Nothing here will be executed because the exception has been thrown
}
catch(InvalidOperationException ex) // Catch and handle the exception
{
// This code is responsible for dealing with the error condition
// that prompted the exception to be thrown. We choose to name
// the exception "ex" in this block.
}
// This code will continue to execute as usual because the exception
// has been handled.
例外をスローすると、基本的には、呼び出し元がそれを処理することが期待される合理的な手段を超えて何らかの条件が発生したことを言っています。これらは、(戻り値がないため) 何らかの形式の構築失敗を通知する方法がないコンストラクターで特に役立ちます。
例外をスローすると、ランタイムは、スローした例外のタイプに割り当て可能なcatchブロックが見つかるまで、実行チェーンを上に移動します。途中で、最終ブロックでコードを実行します。これにより、(通常は) 取得したリソースを解放できます。
例外をスローすると、例外がスタックを上昇します。の主なシナリオは2つありますthrow
。
コードに固有の例外的な条件があります
if(inputVal < 0) { throw new LessThanZeroCustomException("You cannot enter a value less than zero"); }
上記のコードは、と呼ばれる例外オブジェクトをコーディングしたことを前提としています
LessThanZeroCustomException
。私は実際にはこれに名前を付けませんがCustom
、名前の中には、これをコーディングしたことを示すために設計されています。それはおそらくから継承します捕らえられ、投げ直す必要がある例外的な状態があります。これの通常の理由はロギングです。ほとんどの場合、私はこのパターンが嫌いです。あなたがキャッチ、ロギング、スローを何度も繰り返すことに時間を費やしてしまうからです。これは、ほとんどの人が
try ... catch
あらゆるレベルでこのパターンを実行しているためです。うん!
つまり、throw
「処理できない例外条件を見つけたので、このコードを使用している人に例外をスローして知らせています」という意味です。
スローは、処理される例外を作成します。渡したオブジェクトは、例外を説明するデータになります。
何かがスローされるまで、処理される例外はありません。