2011-08-16 2 views
2

私はプログラミングが初めてで、概念的な質問があります。例外は完全にif elseに置き換えることができますか?

つまり、「例外」を「if .. else」に完全に置き換えることはできますか?

「例外」は、エラーまたはクラッシュの原因となるいくつかの例外条件を処理することです。

しかし、変数の値の正確性を保証するために "if .. else"も使用します。

または「例外は」本当に「..それ以外の場合」に置き換えることができますが、「例外」(利便性のような?)他の利点を持っている

を使用していただきありがとうございます、そして私の下手な英語のため申し訳ありません。

+0

あなたは 'exception'または' exception'自体を言うときに 'try-catch'を参照していますか? – dpp

+0

申し訳ありません..しかし、私は違いをキャッチすることはできません –

答えて

1

ほとんどの質問はPythonに関連しているので、ここにその事実に基づいた答えがあります。

Pythonでは、try - exceptブロックを使用するのはイディオム(または "ピジョン")です。我々はこれを"EAFP": Easier to ask for forgiveness than permissionと呼ぶ。

例外のないCでは、通常"LBYL": Look before you leapであり、結果としてif (...)のロットが発生します。

LBYLでも可能ですが、例外的なケースを扱うための例外の使用と条件付きのifの文をプログラミングする言語のイディオムに従ってください。

+0

ありがとう、本当に助けになります!そして、私はこれら2つのコーディングスタイルの存在が暗黙のうちに "例外"が完全に "if .. else"に置き換えられることを意味すると思います。 –

+1

大きな違いの1つは、例外がコールスタックの上位に捕捉され、 'if'によるチェックがはるかにローカライズされていることです。 – Johnsyweb

3

例外と "if..else"の最大の違いは、例外が呼び出しスタックを使い切るということです。ある関数で発生した例外は、呼び出し元の任意の数のフレームがスタックに捕捉される可能性があります。 "if"ステートメントを使用すると、このようにコントロールを転送することはできません。条件を検出したのと同じ関数ですべてを処理する必要があります。

0

これは、管理する分岐条件が多いためです。理論的には、完全なコードには例外は必要ありませんが、実際のコードには完全なコードは存在しません。例外は、制御された方法で問題を処理するための十分に確立されたメカニズムです。

2

技術的には、答えははいです。例外はif-elseで完全に置き換えることができます。例えば、多くの言語(C言語)には、投げられ捕らえられる例外の本来の概念がありません。

例外の主な利点は、コードの可読性と保守性です。それらはif-elseとは異なる目的を果たします。 if-elseはプログラムフロー用ですが、例外は例外条件です。

this excellent articleを参照してください。

+0

注:domanokzは関連する質問をし、私の答えは、あなたがjava/python/javascriptの意味で例外について話していることを前提としています。 –

+0

例外は完全にif-elseに置き換えることができますか?それはばかげている、-1 – GBa

+1

私はコードを持ついくつかのランダムなライブラリ関数を呼び出す場合if(x == 1){throw new FileNotFoundException(); }、あなたはそれをどのように再現しますか?ライブラリのソースを掘り下げ、全く同じコードを繰り返しますか?それはどのように完璧な代替品と考えられていますか? – GBa

0

関数からエラーを処理するための古い方法は、次のようになります(それのように他の人と - 使用している場合、他)

int result = function_returns_error_code(); 
if (result != GOOD) 
{ 
    /* handle problem */ 
} 
else 
{ 
    /* keep going */ 
} 

この解決策で問題が発生している本当の問題がある場合にプログラマーがif ... else(関数が重大な問題を示すエラーコードを返すがプログラマがそれを忘れると)を正しく処理しないと、無視されます。例外を除いて、それは処理されるか、プログラムが終了するまで、呼び出しスタックをさらに進んでいって行きます。

さらに、関数のエラーコードをチェックするか、エラーコードを入れるパラメータを渡すのは面倒です。メンテナンス性と抽象性のために、例外を使用するほうが簡単で、きれいで、より優れています。

0

例外を処理するほとんどの高水準言語では、複数の検証を避けるため、if-elseより効率的です。例えば:ほとんどの通訳で

if value is not 0 then print 10/value

10/valueは内部valueは、あなたが実際には2回、同じ問題のためにテストしてみたので、それを使用する前に、有効な分周器であるかどうかをテストします。場合によっては、ハードウェアから例外が発生してソフトウェアの検証がまったく行われないことがあります。

一方:

try print 10/value ... catch exception

は値のみが一度有効であるかどうかをテストします。さらに、テストは自分のコードよりも最適化され、予期せぬ状況(メモリ不足エラーなど)をより処理することができます。

関連する問題