2009-07-10 4 views
3

この前提条件を処理する以下の方法のどちらがより望ましいか、より大きな意味は何ですか?典型的な前提条件例外を処理する最良の方法は?

1:

If Not Exists(File) Then 
    ThrowException 
    Exit 
End If 
File.Open 
...work on file... 

2:

If Exists(File) Then 
    File.Open 
    ....work on file... 
Else 
    ThrowException 
    Exit 
End 

注:ファイルの存在のチェックを処理するために前提条件の一例です。明らかに、ファイル存在チェックがそれ自身の例外を上向きにスローする良いケースがあります。

+3

3番はどうですか:File.Openは例外をスローしますか? – balpha

+0

よく言いますが、この第3のオプションを追加してください。 – dfa

+0

(btw。、 "* What * about ..."と読んでください)、これは必ずしも最良のオプションだとは限りませんが、 – balpha

答えて

1

スタイルのことです。どちらもうまくいきますが、私はオプション1を好む。できるだけ早く私の方法を終了し、すべての小切手を前に持っていきたい。

4

最初のアプローチの前提条件

1

可読性があることより良いドキュメント、それはので、私は最初のバリアントを好むは、第1よりも高くなっています。
チェックするいくつかの前提条件がある場合、2番目のオプションはかなり速くネストすることができます。また、if/elseは何らかの形で通常のフローにあることを示唆していますが、実際には例外的な状況のためだけです。

したがって、表現力は第2のアプローチよりも高い。
の前提条件については、契約の遵守を確認するために、手順の始めにチェックする必要があります。このため、全体の小切手は、手続きの残りの部分から何らかの形で分離されるべきです。

この2つの理由から、私は間違いなく最初の選択肢に行きます。


:私はあなたの関数の契約が明示的に既存のファイルを定義することを期待し、そのためには、プログラミング・エラーの兆候だろう持っていない:私は前提条件については、ここで話しています。
それ以外の場合は、単に例外処理について話しているだけで、File.Openにそのまま残して、その例外処理を進める方法がある場合のみ例外を処理します。

1

すべての例外は、適切なレベルで生成する必要があります。この場合、あなたの例外はopen()の問題です。これはopen()呼び出しによって処理されます。したがって、あなたはあなたのルーチンに例外コードを追加すべきではありません。

  1. IOバックエンドを抽象化したいとします(上位レベルのルーチンはファイルを開くことも、将来MySQLを使用することもできます)。この場合、IOコードが発生した場合にクライアントコードがより標準的でユニークな例外を生成する方が良いでしょう。
  2. 低レベルの例外の存在は、高レベルの意味を持つ高レベルの例外を意味しますパスワードファイルを開くことができるということは認証が不可能であることを意味します。したがって、UnableToAuthenticateExceptionのようなものを呼び出す必要があります。

2つのケースのコーディングスタイルについては、間違いなく最初に行くでしょう。私は、特にifsの下で、長いコードブロックが嫌いです。彼らはまた、ネストする傾向があり、2番目の戦略を選択すると、あまりにも多くインデントすることになります。

2

事前条件チェックを作業から分離することは、2つの間で何も変更できない場合にのみ有効です。この場合、ファイルを開く前に外部イベントによってファイルが削除される可能性があります。したがって、ファイルの存在のチェックには価値がほとんどなく、オープンコールはこれをチェックして例外を生成しなければなりません。

1

前提が発生した場合、呼び出し側状況でバグである、ものです:あなたは、一定の条件の下で機能を設計したが、彼らが保持されていないので、呼び出し側はこれらの関数が呼び出されたことがないはずですデータ。

ファイルが見つからない場合は、ファイルが必要であり、その存在が前にコードの別の部分でチェックされている場合があります。ただし、これはあまり意味がありません。djna:ファイルの削除やネットワークの障害により、ファイルを開いたときにエラーが発生する可能性があります。

最も一般的な処理は、ファイルを開こうとすることです。失敗すると例外がスローされます。次に、例外がスローされていないと仮定して、通常の作業を続行します。

関連する問題