2011-12-06 11 views
2

私は文書hereを読んでいます。この例は私が尋問しているものです:有効なJava例外処理 - すべての場合に本当に必要ですか?

最初の種類の例外はチェック例外です。これらは、よく書かれたアプリケーションが を予期し回復するべきであるという例外条件です。たとえば、アプリケーション がユーザに入力ファイル名の入力を促し、 という名前をjava.io.FileReaderのコンストラクタに渡すことによってファイルを開きます。通常、ユーザー は既存の読み取り可能なファイルの名前を提供するため、FileReaderオブジェクトの構成 が成功し、 アプリケーションの実行は正常に進行します。しかし、ユーザーが存在しないファイルの名前を で指定し、コンストラクタが java.io.FileNotFoundExceptionをスローすることがあります。よく書かれたプログラムはこの 例外を受け取り、間違いをユーザーに通知し、 修正されたファイル名を要求する可能性があります。

if (file_exists($file)) { 
     //proceed 
    } else { 
     //throw error to user 
    } 

は、私はJavaであなただけの必要があることこれを読んでから理解するために午前:私は、ファイルがASのようなものを持つ有効なユーザ入力を、それを受け入れる前に存在するかどうかをチェックしますPHPで

提供されたファイルが「有効」であることを「仮定」し、例外ハンドラを使用して、存在するかどうかをチェックするのではなくエラーをスローします。または、ファイルが存在するかどうかを確認するための非常にクリーンな/効率的な方法の例外を使用していますか?

答えて

3

どちらの方法でも実行できます。コンテキストに依存する方が意味がありますが、実装されている場合は、チェック例外を処理するか、またはスローすると宣言する必要があります。それは最も理にかなっていることを変えるかもしれない。

ファイルの存在を確認する前に、ファイルの存在を確認する傾向があります。しかし、例外はそれだけです - (一般的に)例外的にの状況を想定しています。

たとえば、私のアプリはファイルが存在するかどうかをチェックします。その間にファイルを使用すると、別のものが出てきて削除されます。今では、私のコードができるだけ優雅に扱わなければならないという例外的な条件があります。

+0

File.exists()をチェックするメリットは、ユーザーの誤植だけでなく、本当に例外的なエラーであることです。 – user949300

0

私はあなたが正しいと思う - Javaのベストプラクティスは、このようなコードをお勧めします:

try { 
    FileInputStream f = new FileInputStream(file); 
    // proceed 
} 
catch (IOException e) { 
    // report error to user 
} 

または正常に開かれていない可能性があり、ファイルを閉じるの例のためのいくつかの複雑さが、ありますが。 Java 7には、それをはるかに簡単にする特別な構文があります(try with resources)。

file_exists()呼び出しを成功させる可能性のあるPHPコードに競合状態がありますが、ファイルが読み込まれると不足している呼び出しに注意してください。もちろん、それは存在するかもしれませんが、読むことはできません。

2

具体例に関して:例外処理は、必ずしもユーザーの入力を検証する方法ではありません。 openまたはread操作(FileInputStreamの中に隠されています)からのエラーリターン(PHP内のもの)を処理する代わりの方法です。それを$err = do_something ($foo)モデルの代替案と考えてください。むしろ書くより、あなたは(間違いなく、より読みやすい?)持って

$err = do_something ($foo); 
if ($err) { 
    complain ($foo, $err); 
    return; 
} 
do_something_else; 

try { 
    foo.doSomething(); 
    doSomethingElse(); 
} catch (SomeException e) { 
    foo.complain (e); 
} 

は理想的には、try {}内部のあなたの全体の動作は、外出先で見やすく、そしてcatch句は1で、すべてのパラノイアを扱います場所。

関連する問題