PowerShell 2.0以及如何处理异常?

时间:2011-01-14 14:06:49

标签: powershell exception-handling powershell-v2.0

运行这两个简单样本时,为什么我会在控制台上显示错误消息? 我希望我得到“错误测试:)”打印在控制台上:

  

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 :)" 
}

非常感谢!

1 个答案:

答案 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 :)"
}