尝试“抓狂”的更好选择?

Tho*_*ham 5 c#

在下面的代码中,除了“疯狂尝试”之外,还有更好的选择吗?我正在收集各种类似的系统信息,并且还有更多这些烦人的try catch结构,并且非常希望摆脱它们。

请注意,这实际上是有道理的。并非可以检索try块中的所有过程信息,而且不可用的内容还是可选的,而同时跳过不可用的内容也是不可接受的,因此为什么不只有一对try catch对。

如果只有那些try catch语句可以进入该Append()方法。

foreach (Process proc in Process.GetProcesses())
{
    try { Append(proc.Threads.Count); } catch { }
    try { Append(proc.Id); } catch { }
    try { Append(proc.ProcessName); } catch { }
    try { Append(proc.BasePriority); } catch { }
    try { Append(proc.StartTime); } catch { }

    Append(proc.HandleCount,
        proc.PrivateMemorySize64,
        proc.NonpagedSystemMemorySize64,
        proc.PagedMemorySize64,
        proc.PeakPagedMemorySize64,
        proc.PeakVirtualMemorySize64);
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*man 5

我认为,您的方法总体上是错误的,但可以使用。您可以使用以下方法“优化”可读性:

private void AppendSafe<T>(Func<T> f)
{
    T val;

    try
    {
        val = f();
    }
    catch { return; }

    Append(val);
}

AppendSafe(() => proc.Threads.Count);
AppendSafe(() => proc.Id);
AppendSafe(() => proc.ProcessName);
AppendSafe(() => proc.BasePriority);
AppendSafe(() => proc.StartTime);
Run Code Online (Sandbox Code Playgroud)

但是我会争相抓住相关的例外。您不希望a NullReferenceException被忽略。

同样,由于异常的代价很高,因此最好确定哪些属性在哪些平台上可用并进行测试。至少在频繁调用此功能时,您将使性能影响降到最低。