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

时间:2019-07-04 14:09:43

标签: 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);
}

1 个答案:

答案 0 :(得分: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);

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

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