3

例として、次のVB.NETコードのスニペットを想定してディレクトリを削除します。

 Try
      Dim SomeFolder="c:\somefolder"
      System.IO.Directory.Delete(SomeFolder, True)    
 Catch ioex As System.IO.IOException     
     'What went wrong? 
     'File locked by another process? 
     'File not found? 
     'something else?
 End Try       

例外ハンドラーで、ディレクトリまたはその中のファイルが開いている場合、ユーザーにファイルを閉じて操作を再試行する機会を与えたいと思いますが、IOExceptionがロックの問題によって引き起こされた場合に限ります。

問題は、無効なパスやファイルに設定された読み取り専用フラグなど、さまざまな理由でIOExceptionがスローされる可能性があることです。これらの各条件は、に異なる値を設定します。例外オブジェクトのメッセージ属性ですが、エラーメッセージ内の特定の文字列のチェックをハードコーディングして、失敗の特定の原因を検出するのは非常に間違っていると感じます。エラー文字列が.netの将来のバージョンで一貫して表現されることにはあまり自信がなく、メッセージが英語以外で返される可能性に対処するためにローカリゼーションコードを書くことに煩わされることを嫌います。 。

非常に一般的な例外処理の懸念事項に対処するためのより良い方法が必要です。私は何かが足りないのですか?

更新/明確化:これまでの回答に感謝しますが、私の例を少し一般的にしすぎた可能性があります。少なくとも今のところ、私は特に、例外ハンドラー内の別のプロセスによってロックされているファイルの状態を検出する方法を探しています。

4

2 に答える 2

7

IOExceptionから継承するいくつかの例外をキャッチできます。

これらにはDirectoryNotFoundExceptionFileNotFoundExceptionおよびその他が含まれます。

これには例外処理を使用します。

Try
  Dim SomeFolder="c:\somefolder"
  System.IO.Directory.Delete(SomeFolder, True)    
Catch fnfex As System.IO.FileNotFoundException     
 'What went wrong? 
 'File not found? 
Catch ioex As System.IO.IOException     
 'What went wrong? 
 'something else?
End Try       

更新

ファイル操作では、操作する前にファイル/フォルダーの存在をテストすることをお勧めします。不必要な例外を避けるため、これがベスト プラクティスです。

Dim SomeFolder="c:\somefolder"

If Directory.Exists(SomeFolder) Then
   System.IO.Directory.Delete(SomeFolder, True)
End If

更新 2 :

コメントと、ロックされたファイルに関する質問への更新に従います。私は同じ問題を抱えていて、例外メッセージを解析することに頼りました.FileLockedExceptionまたは同様のものはありません:(

于 2010-02-09T16:30:10.117 に答える
2

より良いオプションは、例外に頼るのではなく、事前にチェックを行うことです。例えば:

if (Directory.Exists(SomeFolder))
{
    Directory.Delete(SomeFolder, true);
}

そうすれば、少なくとも IOException がスローされる可能性のある多くの理由を削減しようとします。

編集:私のオプションが例外処理の必要性を取り除くと言っているのではなく、通常のプログラムフローの一部ではなく、真の例外にするだけです。

更新: したがって、コメントから、OP の例は、私が提示しようとしているアイデアにはあまり適していません。私が言いたいのは、可能な場合を除いて、可能性のある例外をチェックする前にチェックする方がよいということです。例えば:

if (object != null)
{
    object.Value = true;
}

のような巨大なオーバーロードよりも優れたオプションですcatch(単純化された例):

try
{
    object.Value = true;
}
catch NullRefrenceException
{
    ...
}
catch Exception
{
    ...
}

編集:ファイルロックに関するOPの更新について。ここで get がスローされるというより具体的な期待があるとは思わないので、メッセージを解析することがおそらく唯一の選択肢です。例外なく前もってロックをチェックする方法を見つけられない限り。それでも、チェックとアクセス試行の間でロック状態が変わる可能性があります。

于 2010-02-09T16:30:25.863 に答える