如何从错误属性的结果视图中将错误文本检索到文本中?

时间:2019-07-09 21:03:15

标签: c# asp.net-mvc error-handling

当我的控制器功能遇到运行时错误时,我正在尝试打印错误文本。我的函数中有一行要添加

items.Add(shell.Streams.Error.ToString()); 

但是要添加的文本打印类型

'{System.Management.Automation.PSDataCollection<System.Management.Automation.ErrorRecord>}'

放置断点并解析结果视图时出现的错误是

  

{无法找到具有以下身份的对象:'3180af9e-3c0e-41ff-94fe-3af'}

我尝试将错误类型转换为字符串。

public List<string> PowerShellExecutorGrd(string scriptPath, string arg)
{
    var items = new List<string>();
    using (var shell = PowerShell.Create())
    {
        shell.Commands.AddCommand(scriptPath).AddArgument(arg);
        var results = shell.Invoke();
        System.Diagnostics.Debug.WriteLine(shell.HadErrors.ToString());
        if (shell.HadErrors == false) {
            if (results.Any()) {
                foreach (var psObj in results){
                    items.Add(Server.HtmlEncode(psObj.ToString().Trim('{','}')));
                }
            } 
            else
            {
                items.Add(shell.Streams.Error.ToString());
            }
        };
        return items;
    }
}

错误消息应该是

  

“找不到具有以下身份的对象:'3180af9e-3c0e-41ff-94fe-3af'”,而不是System.Management.Automation.PSDataCollection

1 个答案:

答案 0 :(得分:1)

shell.Streams.Error对象的类型为PSDataCollection<ErrorRecord>。由于PSDataCollection<T>类不会覆盖ToString()方法,因此,当您调用.ToString()时,它实际上是在调用Object.ToString(),这只会打印出类型的名称。这就是为什么您看到自己看到的东西。

重点是shell.Streams.Error并未真正描述该错误。这是错误的集合。因此,您需要遍历集合并在集合内的ToString()对象上调用ErrorRecord

集合中可能只有一个ErrorRecord,但是如果有更多的话,可以将它们连接在一起:

var errorMessage = new StringBuilder();
foreach (ErrorRecord err in shell.Streams.Error) {
    errorMessage.AppendLine(err.ToString());
}
items.Add(errorMessage.ToString());

ErrorRecord确实覆盖了ToString()方法,因此应该可以向您发送期望的消息。