Powershell - 检索输出的内部异常(socketException)

时间:2014-07-09 10:28:04

标签: .net powershell exception-handling error-handling

我最近开始深入研究Powershell中的错误处理,我发现了一些我不太懂的东西(我无法分辨出这种行为来自哪里)。

我有一个简单的函数,它使用[System.Net.DNS]::GetHostByName()

检查域名

如果此变量传递给不存在的主机,则会引发一个讨厌的错误

Exception calling "GetHostByName" with "1" argument(s): "No such host is known"

然后我想抓住错误并在其周围做一些化妆品

$Error[0].Exception.InnerException给出了非常好的输出:

No such host is known

而没有别的 - 我喜欢它,我希望它是出现的消息而不是错误。

当我将上述内容放入catch子句时,一切正常。

但当我看到用分号,或使用Write-host或以任何方式将其转换为' string'时,我感到多么惊讶。值,弄乱了innerException。

亲自试试:

  • 使用'错误'导致SocketException。名称
  • 查看$Error[0].Exception.InnerException投掷
  • 的内容
  • 查看"$($Error[0].Exception.InnerException)"投掷
  • 的内容

第一个命令给出No such host is known,而第二个命令给出完整错误。 请解释一下为什么会发生这种情况?

最后,我希望弹出错误消息:

No such host is known: $computername。是否容易'这样做的方式而不是做血腥的正则表达式?

2 个答案:

答案 0 :(得分:2)

此?

"$($Error[0].Exception.InnerException.message): $computername"

你有恕我直言的行为归因于custom formatting file

答案 1 :(得分:2)

我认为不同之处在于Powershell正在调用哪种方法来获取不同情况下对象的输出。

当您使用

将其输出到管道时
$error[0].exception.innerexception

它正在调用.GetBaseException()方法,它只输出Message属性。

当您将其转换为[string]以与Write-Host一起使用时,它会调用.tostring()方法,该方法输出所有错误信息。