最初にすべきことは、使用している方法を変更することです。
var files = from f in System.IO.Directory.EnumerateDirectories(
@"\\testnetwork\abc$",
"*.*",
SearchOption.AllDirectories)
select f;
EnumerateDirectories
結果が得られるため、より適切に機能しますが、リグがないフォルダーが見つかった場合でも同じ例外がスローされます。結果が得られるという事実により、出力の上に作成することができます。したがって、次のような拡張メソッドを追加すると、次のようになります。
static class ExceptionExtensions
{
public static IEnumerable<TIn> Catch<TIn>(
this IEnumerable<TIn> source,
Type exceptionType)
{
using (var e = source.GetEnumerator())
while (true)
{
var ok = false;
try
{
ok = e.MoveNext();
}
catch(Exception ex)
{
if (ex.GetType() != exceptionType)
throw;
continue;
}
if (!ok)
yield break;
yield return e.Current;
}
}
}
次に、次のようなものを書くことができます。
var files = from f in System.IO.Directory.EnumerateDirectories(
@"\\testnetwork\abc$",
"*.*",
SearchOption.AllDirectories)
.Catch(typeof(UnauthorizedAccessException))
select f;
また、Linq式をクリーンで構成可能な状態に保ちながら、出力は期待どおりの出力になるはずです。この方法の考え方はCatch
、他の例外が発生するのを防ぐことなく、不要な例外を「飲み込む」ことです。これはドラフト実装ですが、あなたはその考えを理解します。