gpt4 book ai didi

powershell - 是否可以在模块中构建一个陷阱方法,然后在其父/全局范围内捕获错误?

转载 作者:行者123 更新时间:2023-12-05 04:34:55 25 4
gpt4 key购买 nike

是否可以在模块中构建一个陷阱方法,然后对父作用域中的错误使用react?

我的目标是在模块中包含脚本的陷阱构造。类似于下面的非功能性示例。陷阱对它们运行的​​范围非常挑剔,我不知道是否或如何操纵它。

myLogModule.psm1

# This only works in its own Scope, how to "expand" it to other scopes?

function MyVerySpecificLog{
** Code **
}

trap{
MyVerySpecificLog ("Error: $_")
break
}

RunningCode.ps1

Import-Module myLogModule

**Code Stuff**

nonsensCode # Hopefully trapped by the trap in myLogModule.psm1

** Code Stuff **

最佳答案

我通读了微软的“about_Trap”,答案似乎是否定的。 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_trap?view=powershell-5.1

阅读页面上的蓝色“重要”框。 “陷阱语句可以在给定范围内的任何地方定义,但始终适用于该范围内的所有语句”和“陷阱语句的范围限定在它编译的位置。如果函数或点源脚本中有陷阱语句,当函数或点源脚本退出,其中的所有陷阱语句都将被删除。”

本页的“捕获错误和范围”部分显示了一个示例,其中在调用 function2 之前设置了一个陷阱,并且该陷阱捕获了 function2 内部发生的错误。但从技术上讲,对 function2 的调用与陷阱在相同的范围内,所以我相信即使那也是相同的范围情况。

我做了一个实验,我在模块的函数中设置了一个陷阱:

function Set-Trap {
trap { "An error: " }
Write-Host "InSetTrap"
}

然后用 .在它的前面,后面是导致错误的行:

. Set-Trap
errorCausingGarbageLine

Set-Trap 中的 Write-Host 确实被调用了,但是即使 Set-Trap 前面的点应该在与导致错误的行相同的范围内调用它,陷阱不再设置并且错误没有被捕获。

也试过这个,也失败了:

. ([ScriptBlock]::Create('trap { "An error: " }'))
AnotherErrorCausingLine

最后一个让我感到惊讶。您可以构建“使用模块”行并将它们作为脚本 block 在代码中的任何位置调用并以这种方式加载模块,但陷阱会失败!

很想听听任何有更好见解的人的意见,但据我所知,我认为 trap 实际上并不是 PowerShell 执行的语句,例如“使用模块”或“导入模块”,而更像是一个范围控制定义我这样说的关键原因是其中一个蓝色框中的这行:“例如,在脚本末尾定义陷阱并在第一条语句中抛出错误仍然会触发该陷阱。”

因此,在范围内放置陷阱的位置并不重要,重要的是陷阱在范围内。因此,它仅修改在该范围内编译的代码。

希望我能给你一个"is"作为答案,我认为你正在尝试做的是一个好主意。

关于powershell - 是否可以在模块中构建一个陷阱方法,然后在其父/全局范围内捕获错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71147501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com