运行这两个简单样本时,为什么我会在控制台上显示错误消息? 我希望我得到“错误测试:)”打印在控制台上:
Get-WmiObject:RPC服务器是 不可用。 (HRESULT的例外情况: 0x800706BA)在行:3 char:15 + Get-WmiObject<<<< -ComputerName possible.nonexisting.domain.com -Credential(Get-Credential)-Class Win32_logicaldisk + CategoryInfo:InvalidOperation:(:) [Get-WmiObject], 收到COMException + FullyQualifiedErrorId:GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
或
试图除以零。在线:3 焦炭:13 + $ i = 1 /<<<< 0
+ CategoryInfo:未指定:(:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId:RuntimeException
第一个例子:
try
{
$i = 1/0
Write-Host $i
}
catch [Exception]
{
Write-Host "Error testing :)"
}
第二个例子:
try
{
Get-WmiObject -ComputerName possibly.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_logicaldisk
}
catch [Exception]
{
Write-Host "Error testing :)"
}
非常感谢!
答案 0 :(得分:11)
第一个例子
错误发生在编译/解析时(PowerShell足够聪明),因此代码甚至没有被执行,它确实无法捕获任何内容。请尝试使用此代码,您将遇到异常:
try
{
$x = 0
$i = 1/$x
Write-Host $i
}
catch [Exception]
{
Write-Host "Error testing :)"
}
第二个例子
如果您在全局设置$ErrorActionPreference = 'Stop'
,则会按预期打印“错误测试:)”。但是你的$ErrorActionPreference
大概是'Continue'
:在这种情况下,没有终止错误/异常,你只是得到引擎打印到主机的非终止错误消息。
您还可以使用$ErrorActionPreference
参数Get-WmiObject
来代替全局ErrorAction
选项。尝试将其设置为Stop
,您将捕获异常。
try
{
Get-WmiObject -ErrorAction Stop -ComputerName possibly.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_logicaldisk
}
catch [Exception]
{
Write-Host "Error testing :)"
}