Compartilhar via


about_Try_Catch_Finally

Descrição breve

Descreve como usar os tryblocos , catche finally para lidar com erros de terminação.

Descrição longa

Use tryos blocos , catche finally para responder ou lidar com erros de terminação 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 impede a execução de uma instrução. Se o PowerShell não tratar 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 outros idiomas, como C#, erros de encerramento são chamados de exceções.

Use o try bloco para definir uma seção de um script na qual você deseja que o PowerShell monitore erros. Quando ocorre um erro dentro do try bloco, o erro é salvo pela primeira vez na $Error variável automática. Em seguida, o PowerShell pesquisa um catch bloco para lidar com o erro. Se a instrução não tiver um bloco correspondentecatch, o try PowerShell continuará a pesquisar um bloco ou Trap instrução apropriado catch nos escopos pai. Depois que um catch bloco for concluído ou se nenhum bloco ou Trap instrução apropriado catch for encontrado, o finally bloco será executado. Se o erro não puder ser tratado, o erro será gravado no fluxo de erros.

Um catch bloco pode incluir comandos para acompanhar 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 todos os recursos que não são mais necessários para o script.

try, catche finally se assemelham às trypalavras-chave , catche finally usadas na linguagem de programação C#.

Syntax

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>}

O try palavra-chave é seguido por uma lista de instruções em 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.

O catch palavra-chave é seguido 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 .NET Framework. Um catch bloco manipula erros da classe de exceção .NET Framework especificada 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>}

O finally palavra-chave é seguido por uma lista de instruções que é executada sempre que o script é executado, mesmo que a try instrução seja executada sem erro ou um erro tenha sido capturado em uma catch instrução .

Observe que pressionar CTRL+C interrompe o pipeline. Objetos enviados para o pipeline não serão exibidos como saída. Portanto, se você incluir uma instrução a ser exibida, como "Finally block has run", 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." }

O 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 manipula 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.doce 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 manipula quaisquer outros erros de encerramento que ocorrem.

O PowerShell corresponde aos tipos de erro por herança. Um catch bloco manipula erros da classe de exceção .NET Framework especificada 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 Command Not Found:

catch [System.SystemException] {"Base Exception" }

Esse catch bloco manipula o erro "Command Not Found" 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 para a 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 encerramento 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 existir um Trap em um bloco mais alto do que o trye não houver nenhum bloco correspondente catch dentro do escopo atual, o assumirá o Trap controle, mesmo que qualquer escopo pai tenha um bloco correspondente catch .

Acessando informações de exceção

Em 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 por fim

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 um palavra-chave de Saída interromper o script de dentro de um catch bloco.

Confira também