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

Kol*_*iat 5 .net error-handling powershell exception

我最近开始深入研究 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或以任何方式将其转换为“字符串”值时,我感到多么惊讶,弄乱了innerException。

自己尝试一下:

  • 使用“错误”名称导致 SocketException
  • 看看$Error[0].Exception.InnerException会抛出什么
  • 看看"$($Error[0].Exception.InnerException)"会抛出什么

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

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

No such host is known: $computername。有没有“简单”的方法来做到这一点,而不是做该死的正则表达式?

mjo*_*nor 6

我相信区别在于 Powershell 在不同情况下调用哪种方法来获取对象的输出。

当你只是使用它输出到管道时

$error[0].exception.innerexception
Run Code Online (Sandbox Code Playgroud)

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

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