在此示例中,如何获取引发异常的行号?下面的示例仅提供了我在其中调用脚本块的行号(即$ sb.Invoke())。我想要将“ FooBar中的错误”抛出的行号。
function Foobar {
throw "Error in FooBar"
}
function Bar {
FooBar
}
function Foo {
Bar
}
try {
$sb = ${function:Foo}
$sb.Invoke()
}
catch {
$ErrorMessage = $_.Exception.Message
$line = $_.InvocationInfo.ScriptLineNumber
$script_name = $_.InvocationInfo.ScriptName
write-host "<--Error: Occurred on line $line in script $script_name."
Write-host "<--Error: $ErrorMessage"
}
Run Code Online (Sandbox Code Playgroud)
更新:
如果我更改:
$sb = ${function:Foo}
$sb.Invoke()
Run Code Online (Sandbox Code Playgroud)
对此:
$func_info = get-command Foo
Invoke-Command $func_info.ScriptBlock
Run Code Online (Sandbox Code Playgroud)
有用。
ben*_*ben -1
这似乎是 Invoke() 错误处理的限制 - 它传递错误消息但丢弃调用信息。
一种解决方法是捕获并重新抛出脚本块本身,但需要更多信息,例如
$sb = {
try {
Foo
}
catch {
throw "Error: $($_.Exception.Message). Stack trace:`n$($_.ScriptStackTrace)"
}
}
$sb.Invoke()
Run Code Online (Sandbox Code Playgroud)
这输出:
<--Error: Occurred on line 22 in script .
<--Error: Exception calling "Invoke" with "0" argument(s): "Error: Error in FooBar. Stack trace:
at Foobar, <No file>: line 2
at Bar, <No file>: line 6
at Foo, <No file>: line 10
at <ScriptBlock>, <No file>: line 16
at <ScriptBlock>, <No file>: line 22"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2116 次 |
| 最近记录: |