PowerShell中的Try / Catch块用于处理脚本中产生的错误。具体而言,错误应该是终止错误。在最后在PowerShell中块不是强制性的,每次沿写try / catch语句,但它会不管发生错误或不执行。
因此,当您使用Try块时,Catch块是必需的,但不是Final块。
尝试/捕获具有终止错误的块-以下是没有finally块的终止错误的示例。
try{ This is not allowed "This is Allowed" } catch{ Write-Host "Error occured" -BackgroundColor DarkRed }
输出结果
PS C:\WINDOWS\system32> try{ This is not allowed "THis is allowed" } catch{ Write-Host "Error occured" -BackgroundColor Darkred } Error occured
在上面的示例中,我们返回了不允许的内容,但是下一行是真实的,尽管由于终止错误而无法执行。
我们的目标是捕获Try块中生成的异常和错误消息。众所周知,错误存储在$Error变量中。如果检查$error变量的输出,则可以获取整个视图,但是无论何时运行任何脚本并处理错误,请确保使用$error.clear()命令或使用新的PowerShell控制台清除旧错误。如果您知道数组中特定的Error变量位置,则可以直接使用它。例如,$error [2]
PS C:\WINDOWS\system32> $Error This : The term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:3 char:5 + This is not allowed + ~~~~ + CategoryInfo : ObjectNotFound: (This:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
我们可以看到$Error变量的所有属性。
PS C:\WINDOWS\system32> $Error | Get-Member | Select Name, MemberType Name MemberType ---- ---------- Equals Method GetHashCode Method GetObjectData Method GetType Method ToString Method CategoryInfo Property ErrorDetails Property Exception Property FullyQualifiedErrorId Property InvocationInfo Property PipelineIterationInfo Property ScriptStackTrace Property TargetObject Property PSMessageDetails ScriptProperty
上面的属性很少,有助于查找异常和错误详细信息。让我们看看它们,我们也可以在Catch块中利用它们。
第一个InvocationInfo属性。您也可以使用$Error [0],但这是到目前为止生成的唯一错误,因此我们直接使用$Error,但是不能直接使用$error变量获取AutoSuggestion Popup。
PS C:\WINDOWS\system32> $Error.InvocationInfo MyCommand : BoundParameters : {} UnboundArguments : {} ScriptLineNumber : 3 OffsetInLine : 5 HistoryId : 50 ScriptName : Line : This is not allowed PositionMessage : At line:3 char:5 + This is not allowed + ~~~~ PSScriptRoot : PSCommandPath : InvocationName : This PipelineLength : 0 PipelinePosition : 0 ExpectingInput : False CommandOrigin : Internal DisplayScriptPosition :
您可以从Line和PositionMessage获取特定信息,如下所示。
PS C:\WINDOWS\system32> $Error.InvocationInfo.Line This is not allowed PS C:\WINDOWS\system32> $Error.InvocationInfo.PositionMessage At line:3 char:5 + This is not allowed + ~~~~
现在检查异常属性。
PS C:\WINDOWS\system32> $Error.Exception The term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
异常消息
PS C:\WINDOWS\system32>$error.Exception.Message The term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
您可以使用其他认为有助于显示错误消息的属性。我们将在Catch块中使用其中一些来捕获错误。当我们处理当前错误时,我们将使用$_。处理当前的错误/异常。
$error.clear() try{ This is not allowed "THis is allowed" } catch{ Write-Host "`nError Message: " $_.Exception.Message Write-Host "`nError in Line: " $_.InvocationInfo.Line Write-Host "`nError in Line Number: "$_.InvocationInfo.ScriptLineNumber Write-Host "`nError Item Name: "$_.Exception.ItemName }
输出结果
Error Message: The term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. Error in Line: This is not allowed Error in Line Number: 3 Error Item Name:
正如我们在上面看到的,没有Final块,但是Try / Catch继续起作用。您可以添加Final模块来清除变量和错误并显示任何消息。
try{ This is not allowed "THis is allowed" } catch{ Write-Host "`nError Message: " $_.Exception.Message Write-Host "`nError in Line: " $_.InvocationInfo.Line Write-Host "`nError in Line Number: "$_.InvocationInfo.ScriptLineNumber Write-Host "`nError Item Name: "$_.Exception.ItemName } finally{ "This is going to run anyway" $error.clear() }
尝试/捕获块具有非终止错误。
正如我们在上面的示例中看到的那样,可以使用Try / Catch块控制终止错误,但不能终止错误,因为它们是内置cmdlet并且函数生成了错误,并且Error操作的默认首选项是Continue,因此下一步是即使未处理该错误,该命令也会继续运行。
PS C:\WINDOWS\system32> $ErrorActionPreference Continue
要将非终止错误强制为终止错误,我们需要将$ErrorActionPreference变量更改为Stop或需要将ErrorAction参数与Stop值一起使用。在这里,我们将使用ErrorAction参数,因为我们需要它用于特定命令而不是整个脚本。
$error.clear() try{ Get-Service WhichService -ErrorAction Stop } catch{ Write-Host "`nError Message: " $_.Exception.Message Write-Host "`nError in Line: " $_.InvocationInfo.Line Write-Host "`nError in Line Number: "$_.InvocationInfo.ScriptLineNumber Write-Host "`nError Item Name: "$_.Exception.ItemName } finally{ "This is going to run anyway" $error.clear() }
输出结果
Error Message: Cannot find any service with service name 'WhichService'. Error in Line: Get-Service WhichService -ErrorAction Stop Error in Line Number: 4 Error Item Name: This is going to run anyway
如上例所示,Get-Service会生成非终止错误,我们可以通过–ErrorAction Stop参数将其转换为终止错误,并且Catch Block捕获了相同的异常。
手动处理特定异常
如果要处理特定类型的异常,则可以在catch块中提供异常名称。要知道异常的名称,您需要获取$Error变量的属性,它是GetType()。在下面的示例中,我们需要从下面的错误输出中找到异常名称。
PS C:\WINDOWS\system32> Test-Connection Remote-Computer -Count 1 -ErrorAction Stop Test-Connection : Testing connection to computer 'Remote-Computer' failed: No such host is known At line:1 char:4 + Test-Connection Remote-Computer -Count 1 -ErrorAction Stop + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ResourceUnavailable: (Remote-Computer:String) [Test-Connection], PingException + FullyQualifiedErrorId : TestConnectionException,Microsoft.PowerShell.Commands. TestConnectionCommand
假设您的错误存储在$Error [0]变量中,则需要运行以下命令来获取要在catch块中使用的异常名称。
$Error[0].Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error[0].Exception.GetType().FullName System.Management.Automation.MethodInvocationException
通过上面的命令获得了异常类型名称,您可以在catch块中使用相同的名称,因此catch块将仅捕获该特定异常。
$error.clear() try{ Test-Connection Remote-Computer -Count 1 -ErrorAction Stop } catch [System.Net.NetworkInformation.PingException]{ Write-Host $_.Exception.Message -BackgroundColor DarkRed }
输出结果
PS C:\WINDOWS\system32> $error.clear() try{ Test-Connection Remote-Computer -Count 1 -ErrorAction Stop } catch [System.Net.NetworkInformation.PingException]{ Write-Host $_.Exception.Message -BackgroundColor DarkRed -NoNewline } Testing connection to computer 'Remote-Computer' failed: No such host is known
捕获多个异常PowerShell。
您还可以在PowerShell中捕获多个异常。为此,您可以使用单个Try块和多个catch块。
$error.clear() $ErrorActionPreference = "Stop" try{ Get-ItemProperty C:\temp\cominfo1.html Test-Connection Remote-Computer -Count 1 } catch [System.Management.Automation.ItemNotFoundException]{ Write-Host $_.Exception.Message -BackgroundColor DarkRed } catch [System.Net.NetworkInformation.PingException]{ Write-Host "" Write-Host $_.Exception.Message -BackgroundColor DarkRed } Finally{ Write-Output "`nSetting up ErrorActionPreference to the Default value" $ErrorActionPreference = "Continue" }
输出结果
Cannot find path 'C:\temp\cominfo1.html' because it does not exist. Setting up ErrorActionPreference to the Default value
在这里,在第一个命令中,本身会生成错误,因此下一个命令将不会执行。如果第一个命令没有产生任何错误,则将检查下一个命令,如果发生异常,则将执行带有该特定异常块的Catch。
如果您不想处理多个异常,并且仍然需要某些命令,则可以忽略错误,但不应通过catch块传递错误,以便下一条命令可以执行,则可以在ErrorAction参数中使用Ignore或SilentlyIgnore。
在实际开发中,根据 try catch 语句的执行过程,try 语句块和 catch 语句块有可能不被完全执行,而有些处理代码则要求必须执行。例如,程序在 try 块里打开了一些物理资源(如数据库连接、网络连接和磁盘文件等),这些物理资源都必须显式回收。 Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只回收堆内存中对象所占用的内存。 所以为了确保一定能回收 try 块中打开的物理资源,异
是否有像java try catch finally这样的linux bash命令?还是linux shell总是在运行?
本文向大家介绍try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?相关面试题,主要包含被问及try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?时的应答技巧和注意事项,需要的朋友参考一下 finally 一定会执行,即使是 catch 中 return 了,catch 中的 return
本文向大家介绍C#中的try catch finally用法分析,包括了C#中的try catch finally用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中的try catch finally用法。分享给大家供大家参考。具体分析如下: try中的程序块是有可能发生错误的程序块,catch中的程序块是当发生错误的时候才会执行的代码块,finally中的程序块是无论是否发生
问题内容: 根据Java语言规范的第§14.20.2节 通过首先执行try块来执行带有finally块的try语句。然后有一个选择: 如果try块的执行正常完成,则执行finally块,然后可以选择: 如果finally块正常完成,则try语句正常完成。 如果finally块由于原因S突然完成,则try语句由于原因S突然完成 如果我正确地解释了它,那么在执行try块之后最终会被调用,但是所有这些如
问题内容: 我刚遇到以下代码: 毫无疑问,运行此代码将产生“返回值:3”的输出。 但是,我对此感到好奇: JVM中的内部机制。有谁知道VM是否通过覆盖第一个“ return 1”来实际替换堆栈上的返回值?如果是这样,我在哪里可以找到更多信息。 我还没有找到以这种方式使用并允许在JVM中实现的final机制中的返回值的用法。如果将此代码构造用作返回错误代码的手段,我认为有更好的方法记录错误或返回这些