about_Try_Catch_Finally
Descrição breve
Descreve como usar os try
blocos , catch
e e finally
para lidar com erros de encerramento.
Descrição longa
Use try
, catch
, e finally
blocos para responder ou manipular erros de encerramento em scripts. A Trap
instrução também pode ser usada para lidar com erros de encerramento em scripts. Para obter mais informações, consulte about_Trap.
Um erro de encerramento interrompe a execução de uma instrução. Se o PowerShell não lidar com um erro de encerramento de alguma forma, o PowerShell também interromperá a execução da função ou do script usando o pipeline atual. Em outras linguagens, como C#, os erros de encerramento são chamados de exceções.
Use o bloco para definir uma seção de um script na qual você deseja que o try
PowerShell monitore erros. Quando ocorre um erro dentro do try
bloco, o erro é salvo primeiro na $Error
variável automática. Em seguida, o PowerShell procura um catch
bloco para lidar com o erro. Se a instrução não tiver um bloco correspondentecatch
, o try
PowerShell continuará a procurar um bloco ou Trap
instrução apropriado catch
nos escopos pai. Depois que um catch
bloco é concluído ou se nenhum bloco ou Trap
instrução apropriada catch
for encontrado, o finally
bloco é executado. Se o erro não puder ser tratado, o erro será gravado no fluxo de erros.
Um catch
bloco pode incluir comandos para rastrear o erro ou para recuperar o fluxo esperado do script. Um catch
bloco pode especificar quais tipos de erro ele captura. Uma try
instrução pode incluir vários catch
blocos para diferentes tipos de erros.
Um finally
bloco pode ser usado para liberar quaisquer recursos que não sejam mais necessários para o seu script.
try
, catch
, e finally
se assemelham às try
palavras-chave , catch
e finally
usadas na linguagem de programação C#.
Sintaxe
Uma try
instrução contém um try
bloco, zero ou mais catch
blocos e zero ou um finally
bloco. Uma try
instrução deve ter pelo menos um catch
bloco ou um finally
bloco.
O seguinte mostra a sintaxe do try
bloco:
try {<statement list>}
A try
palavra-chave é seguida por uma lista de instruções entre chaves. Se ocorrer um erro de encerramento enquanto as instruções na lista de instruções estiverem sendo executadas, o script passará o objeto de erro do try
bloco para um bloco apropriado catch
.
O seguinte mostra a sintaxe do catch
bloco:
catch [[<error type>][',' <error type>]*] {<statement list>}
Os tipos de erro aparecem entre colchetes. Os colchetes mais externos indicam que o elemento é opcional.
A catch
palavra-chave é seguida por uma lista opcional de especificações de tipo de erro e uma lista de instruções. Se ocorrer um erro de encerramento no bloco, o try
PowerShell procurará um bloco apropriado catch
. Se um for encontrado, as instruções no catch
bloco serão executadas.
O catch
bloco pode especificar um ou mais tipos de erro. Um tipo de erro é uma exceção do Microsoft .NET Framework ou uma exceção derivada de uma exceção do .NET Framework. Um catch
bloco lida com erros da classe de exceção especificada do .NET Framework ou de qualquer classe derivada da classe especificada.
Se um catch
bloco especificar um tipo de erro, esse catch
bloco manipulará esse tipo de erro. Se um catch
bloco não especificar um tipo de erro, esse catch
bloco manipulará qualquer erro encontrado no try
bloco. Uma try
instrução pode incluir vários catch
blocos para os diferentes tipos de erro especificados.
O seguinte mostra a sintaxe do finally
bloco:
finally {<statement list>}
A finally
palavra-chave é seguida por uma lista de instruções que é executada sempre que o script é executado, mesmo que a instrução tenha sido executada try
sem erro ou um erro tenha sido detectado em uma catch
instrução.
Observe que pressionar CTRL+C interrompe o pipeline. Os objetos enviados para o pipeline não serão exibidos como saída. Portanto, se você incluir uma instrução a ser exibida, como "Finalmente o bloco foi executado", ela não será exibida depois que você pressionar CTRL+C, mesmo que o finally
bloco tenha sido executado.
Captura de erros
O script de exemplo a seguir mostra um try
bloco com um catch
bloco:
try { NonsenseString }
catch { "An error occurred." }
A catch
palavra-chave deve seguir imediatamente o try
bloco ou outro catch
bloco.
O PowerShell não reconhece "NonsenseString" como um cmdlet ou outro item. A execução desse script retorna o seguinte resultado:
An error occurred.
Quando o script encontra "NonsenseString", ele causa um erro de encerramento. O catch
bloco lida com o erro executando a lista de instruções dentro do bloco.
Usando várias instruções catch
Uma try
instrução pode ter qualquer número de catch
blocos. Por exemplo, o script a seguir tem um try
bloco que baixa MyDoc.doc
, e contém dois catch
blocos:
try {
$wc = new-object System.Net.WebClient
$wc.DownloadFile("http://www.contoso.com/MyDoc.doc","c:\temp\MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from http://www.contoso.com."
}
catch {
"An error occurred that could not be resolved."
}
O primeiro catch
bloco lida com erros dos tipos System.Net.WebException e System.IO.IOException . O segundo catch
bloco não especifica um tipo de erro. O segundo catch
bloco lida com quaisquer outros erros de encerramento que ocorram.
O PowerShell corresponde aos tipos de erro por herança. Um catch
bloco lida com erros da classe de exceção especificada do .NET Framework ou de qualquer classe derivada da classe especificada. O exemplo a seguir contém um catch
bloco que captura um erro "Comando não encontrado":
catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }
O tipo de erro especificado, CommandNotFoundException, herda do tipo System.SystemException . O exemplo a seguir também captura um erro de Comando Não Encontrado:
catch [System.SystemException] {"Base Exception" }
Esse catch
bloco lida com o erro "Comando não encontrado" e outros erros que herdam do tipo SystemException .
Se você especificar uma classe de erro e uma de suas classes derivadas, coloque o catch
bloco da classe derivada antes do catch
bloco da classe geral.
Observação
O PowerShell encapsula todas as exceções em um tipo RuntimeException . Portanto, especificar o tipo de erro System.Management.Automation.RuntimeException se comporta da mesma forma que um bloco catch não qualificado.
Usando armadilhas em um try catch
Quando ocorre um erro de terminação em um try
bloco com um Trap
definido dentro do try
bloco, mesmo que haja um bloco correspondente catch
, a instrução assume o Trap
controle.
Se a Trap
existir em um bloco maior que o try
, e não houver nenhum bloco correspondente catch
dentro do escopo atual, o assumirá Trap
o controle, mesmo que qualquer escopo pai tenha um bloco correspondente catch
.
Acessando informações de exceção
Dentro de um catch
bloco, o erro atual pode ser acessado usando $_
, que também é conhecido como $PSItem
. O objeto é do tipo ErrorRecord.
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_
}
A execução desse script retorna o seguinte resultado:
An Error occurred:
The term 'NonsenseString' 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.
Há propriedades adicionais que podem ser acessadas, como ScriptStackTrace, Exception e ErrorDetails. Por exemplo, se alterarmos o script para o seguinte:
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_.ScriptStackTrace
}
O resultado será semelhante a:
An Error occurred:
at <ScriptBlock>, <No file>: line 2
Liberando recursos usando finalmente
Para liberar recursos usados por um script, adicione um finally
bloco após os try
blocos e catch
. As finally
instruções de bloco são executadas independentemente de o try
bloco encontrar um erro de encerramento. O PowerShell executa o finally
bloco antes que o script seja encerrado ou antes que o bloco atual saia do escopo.
Um finally
bloco é executado mesmo se você usar CTRL+C para interromper o script. Um finally
bloco também será executado se uma palavra-chave Exit interromper o script de dentro de um catch
bloco.