PowerShell 5.1 控制台:如何获得更好的默认错误处理?

PowerShell 5.1 控制台:如何获得更好的默认错误处理?

在 powershell 5.1 中,默认错误响应如下所示:


Aug01 14:26:01 C:\> throw [Collections.Generic.KeyNotFoundException]::new('example')
example
At line:1 char:1
+ throw [Collections.Generic.KeyNotFoundException]::new('example')
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], KeyNotFoundException
    + FullyQualifiedErrorId : example

那里有一些有用的信息。文件和行、消息、类型名称……我的意思是,“完全合格的错误 ID”是多余的,而且很糟糕,告诉我 CategoryInfo 是“OperationStopped”是没有帮助的。而且它很丑陋。但所有这些都是可以协商的。

最大的错误是,我必须竭尽全力才能获得像样的堆栈跟踪。在进行模块开发时,这真是令人恼火。我厌倦了写作$err = $error[0]; $err.ErrorRecord.ScriptStackTrace——是的,我凭记忆写了这些。

当然,在编写脚本时,您可以通过将整个脚本包装在 中来解决这个问题。但是当只使用控制台时怎么办?如果出现问题,try..catch我不想为了获得合适的错误信息而逐行执行。try..catch

现在,我知道trap存在,但 trap 非常有限。理想情况下,我希望我的 $PROFILE 中有某种方式说“使用此trap语句每一个在控制台中执行。但这是我尝试的第一件事 -trap在 $PROFILE 中设置不起作用,因为即使在点源调用中引入陷阱,陷阱也不会遵循范围。

答案1

这是这篇文章的主题 是否可以自定义 powershell 中的错误显示?

以下是 Don Jones 所接受答案的部分引述。

如果您只想更改文本颜色,则可以使用内置的 $host 对象。但是,您无法更改错误消息本身 - 这是硬编码的。

您可以做的是 (a) 抑制错误消息,以及 (b) 捕获错误并显示您自己的错误。

通过设置完成(a)$ErrorActionPreference = "SilentlyContinue"- 这不会停止错误,但它会抑制消息。

完成 (b) 需要做更多工作。默认情况下,大多数 PowerShell 命令不会产生可捕获的异常。因此,您必须学会运行命令并添加 -EA“Stop”参数,以便在出现问题时生成可捕获的异常。完成此操作后,您可以通过键入以下内容在 shell 中创建陷阱:

trap {
 # handle the error here
}

您可以将其放入配置文件脚本中,而不必每次都输入它。在陷阱中,您可以使用 Write-Error cmdlet 输出您想要的任何错误文本。

可能比您想要做的工作要多,但这基本上就是您完成所要求的事情的方式。

相关内容