TÓPICO
about_Try_Catch_Finally
DESCRIÇÃO RESUMIDA
Descreve como usar os blocos Try, Catch e Finally para tratar erros de
encerramento.
DESCRIÇÃO LONGA
Use os blocos Try, Catch e Finally para responder ou tratar erros de
encerramento em scripts. A instrução Trap também pode ser usada para
tratar 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 Windows PowerShell não tratar um erro de encerramento de
algum modo, o Windows PowerShell também deixará de executar a
função ou o script usando o pipeline atual. Em outras linguagens,
como C#, esses erros são chamados de exceções. Para obter mais
informações sobre erros, consulte about_Errors.
Use o bloco Try para definir a seção de um script onde você
deseja que o Windows PowerShell monitore erros. Quando um erro
ocorre dentro do bloco Try, primeiro ele é salvo na variável
automática $Error. Depois, o Windows PowerShell procura um bloco
Catch para tratar o erro. Se a instrução Try não tiver um bloco Catch
correspondente, o Windows PowerShell continuará procurando um bloco
Catch ou uma instrução Trap apropriada nos escopos pai. Depois que um
bloco Catch for concluído, ou se não for possível localizar nenhum
bloco Catch ou instrução Trap apropriada, o bloco Finally será
executado. Se não for possível tratar o erro, ele será gravado no
fluxo de erros.
Um bloco Catch pode incluir comandos para acompanhar a falha ou para
recuperar o fluxo esperado do script. Um bloco Catch pode especificar
os tipos de erro que captura. Uma instrução Try pode incluir vários
blocos Catch para diferentes tipos de erros.
Um bloco Finally pode ser usado para liberar os recursos que já
não são mais necessários no seu script.
Try, Catch e Finally se assemelham às palavras-chave Try, Catch e
Finally usadas na linguagem de programação C#.
Sintaxe
Uma instrução Try contém um bloco Try, zero ou mais blocos
Catch e zero ou um bloco Finally. Uma instrução Try deve ter
pelo menos um bloco Catch ou um bloco Finally.
Esta é a sintaxe do bloco Try:
try {<lista de instruções>}
A palavra-chave Try é seguida por uma lista de instruções entre
chaves. Se um erro de encerramento ocorrer enquanto as
instruções na lista de instruções estiverem em execução, o script
transmitirá o objeto de erro do bloco Try para um bloco Catch apropriado.
Esta é a sintaxe do bloco Catch:
catch [[<tipo de erro>][',' <tipo de erro>]*] {<lista de instrução>}
Os tipos de erro aparecem entre colchetes. Os colchetes
externos indicam que o elemento é opcional.
A palavra-chave Catch é seguida por uma lista opcional de
especificações de tipos de erro e uma lista de instruções. Se
um erro de encerramento ocorrer no bloco Try, o Windows PowerShell
procurará um bloco Catch apropriado. Se ele for encontrado, serão
executadas as instruções no bloco Catch.
O bloco Catch pode especificar um ou mais tipos de erro. Um
tipo de erro é uma exceção do Microsoft .NET Framework ou
derivada de uma exceção do .NET Framework. Um bloco Catch trata
erros da classe de exceções do .NET Framework especificada ou
de qualquer classe derivada da classe especificada.
Se um bloco Catch especificar um tipo de erro, tratará daquele
tipo de erro. Se não especificar um tipo de erro, tratará
qualquer erro encontrado no bloco Try. Uma instrução Try pode
incluir vários blocos Catch para os diferentes tipos de erro
especificados.
Esta é a sintaxe do bloco Finally:
finally {<lista de instruções>}
A palavra-chave Finally é seguida por uma lista de instruções
executada sempre que o script é executado, mesmo que a
instrução Try seja executada sem erro ou que um erro seja
capturado em uma instrução Catch.
Observe que pressionar CTRL+C interrompe o pipeline. Objetos
enviados ao pipeline não serão exibidos como saída. Portanto,
se você incluir uma instrução a ser exibida, como "O bloco
Finally foi executado", ela não será exibida depois que você
pressionar CTRL+C, mesmo que o bloco Finally tenha sido executado.
Capturando erros
O script de exemplo a seguir mostra um bloco Try com um bloco Catch:
try { NonsenseString }
capture {"Ocorreu um erro." }
A palavra-chave Catch deve vir imediatamente após o bloco Try
ou outro bloco Catch.
O Windows PowerShell não reconhece "NonsenseString" como um
cmdlet ou outro item. A execução desse script retorna o
seguinte resultado:
Ocorreu um erro.
Quando o script encontra "NonsenseString", causa um erro de
encerramento. O bloco Catch trata o erro executando a lista de
instruções dentro do bloco.
Usando várias instruções Catch
Uma instrução Try pode ter qualquer número de blocos Catch. Por
exemplo, o script a seguir tem um bloco Try que baixa
MyFile.doc e contém dois blocos Catch:
try
{
$wc = new-object System.Net.WebClient
$wc.DownloadFile("https://www.contoso.com/MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException]
{
"Não é possível baixar MyDoc.doc de https://www.contoso.com."
}
catch
{
"Ocorreu um erro que não pôde ser resolvido."
}
O primeiro bloco Catch trata erros dos tipos System.Net.WebExcep
tion e System.IO.IOException. O segundo bloco Catch não
especifica um tipo de erro. O segundo bloco Catch tratará
qualquer outro erro de encerramento que ocorrer.
O Windows PowerShell faz a correspondência de tipos de erro por
herança. Um bloco Catch trata erros da classe de exceções do .NET
Framework especificada ou de qualquer classe derivada da classe
especificada. O exemplo a seguir contém um bloco Catch que captura um
erro de "Comando não encontrado":
catch [System.Management.Automation.CommandNotFoundException]
{"Exceção herdada" }
O tipo de erro especificado, CommandNotFoundException, é
herdeiro do tipo System.SystemException. O exemplo a seguir
também captura um erro de "Comando não encontrado":
catch [System.SystemException] {"Exceção de base" }
Esse bloco Catch trata o erro de "Comando não encontrado" e
outros erros herdeiros do tipo SystemException.
Se você especificar uma classe de erros e uma de suas classes
derivadas, coloque o bloco Catch para a classe derivada antes
do bloco Catch para a classe geral.
Liberando recursos com o uso de Finally
Para liberar os recursos usados por um script, adicione um
bloco Finally depois dos blocos Try e Catch. As instruções do bloco
Finally serão executadas, independentemente de o bloco Try encontrar
ou não um erro de encerramento. O Windows PowerShell executa o bloco
Finally antes de o script ser concluído ou o bloco atual sair do escopo.
Um bloco Finally será executado até mesmo se você usar CTRL+C para
interromper o script. Um bloco Finally também será executado se uma
palavra-chave Exit interromper o script a partir de um bloco Catch.
CONSULTE TAMBÉM
about_Errors
about_Trap