about_Try_Catch_Finally

Aplica-se a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

TÓPICO

about_Try_Catch_Finally

DESCRIÇÃO BREVE

Descreve como usar os blocos Try, Catch e Finally para manipular os erros de finalização.

DESCRIÇÃO LONGA

Use os blocos Try, Catch e Finally para responder ou manipular os erros de finalização em scripts. A instrução Trap também pode ser usada para manipular erros de terminação em scripts. Para obter mais informações, consulte o about_Trap.

Um erro de terminação interrompe uma instrução de execução. Se Windows PowerShell® não manipula um erro de terminação de alguma forma,Windows PowerShell também para executar a função ou script usando o pipeline atual. Em outras linguagens, como C#, os erros de finalização são denominados exceções. Para obter mais informações sobre erros, consulte about_Errors.

Usar o bloco Try para definir uma seção de um script no qual você deseja Windows PowerShell para monitorar os erros. Quando um erro ocorre no bloco Try, primeiramente ele é salvo na variável automática $Error. Windows PowerShell Em seguida, busca-se o bloco Catch para lidar com o erro. Se a instrução Try não tiver um bloco Catch coincidente, Windows PowerShell continuará a procurar por um bloco Catch adequado ou instrução Trap nos escopos pai. Após a conclusão de um bloco Catch ou se nenhum bloco Catch adequado ou instrução Trap for encontrado, o bloco Finally será executado. Se o erro não puder ser tratado, o erro é gravado para o fluxo de erro.

Um bloco Catch pode incluir comandos para controlar a falha ou para recuperar o fluxo esperado do script. Um bloco Catch pode especificar quais tipos de erros são identificados. Uma instrução Try pode incluir vários blocos Catch para diferentes tipos de erros.

Um bloco Finnaly pode ser usado para liberar quaisquer recursos que não sejam mais necessários pelo script.

Try, Catch e Finally são semelhantes às palavras-chaves 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.

O código a seguir mostra a sintaxe do bloco Try:

          try {<statement list>}

A palavra-chave Try é seguida por uma lista de instruções entre chaves. Se ocorrer um erro de finalização enquanto as instruções na lista de instrução estiverem sendo executadas, o script passa o objeto de erro do bloco Try para um bloco Catch apropriado.

O código a seguir mostra a sintaxe do bloco Catch:

          catch [[<error type>][',' <error type>]*] {<statement list>}

Os tipos de erro aparecem entre colchetes. Os colchetes mais externos indicam que o elemento é opcional.

A palavra-chave Catch é seguida por uma lista opcional de especificações de tipo de erro e uma lista de instruções. Se ocorrer um erro de terminação no bloco Try, Windows PowerShell procura um bloco Catch adequado. Se um for encontrado, sã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 uma exceção que é derivada de uma exceção do .NET Framework. Um bloco Catch lida com os erros da classe de exceção do .NET Framework especificada ou de qualquer classe que deriva da classe especificada.

Se um bloco Catch especifica um tipo de erro, esse bloco Catch lida com esse tipo de erro. Se um bloco Catch não especificar um tipo de erro, esse bloco Catch lida com qualquer erro encontrado no bloco Try. Uma instrução Try pode incluir vários blocos Catch para os tipos diferentes de erros especificados.

A seguir, é exibida a sintaxe do bloco Finally:

          finally {<statement list>}

A palavra-chave Finally é seguida por uma lista de instruções que será executada sempre que o script for executado, mesmo que a instrução Try seja executada sem erro ou um erro tenha sido capturado em uma instrução Catch.

Observe que pressionar CTRL + C para o pipeline. Objetos que são enviados para o pipeline não serão exibidos como saída. Portanto, se você incluir uma instrução a ser exibida, como "Finalmente bloco foi executado", ela não será exibido depois que você pressionar CTRL + C, mesmo se o bloco tiver sido finalmente executado.

CAPTURA DE ERROS

O script de exemplo a seguir mostra um bloco Try com um bloco Catch:

          try { NonsenseString }
          catch { "An error occurred." }

A palavra-chave Catch deve seguir imediatamente o bloco ou outro bloco Catch.

Windows PowerShell não reconhece "NonsenseString" como um cmdlet ou outro item. Executar esse script retorna o seguinte resultado:

          An error occurred.

Quando o script encontra "NonsenseString", ocorrerá um erro de terminação. O bloco Catch lida com o erro ao executar 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 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]
          {
              "Unable to download MyDoc.doc from https://www.contoso.com."
          }
          catch
          {
              "An error occurred that could not be resolved."
          }

O primeiro bloco Catch lida com os erros dos tipos System.Net.WebException e System.IO.IOException. O segundo bloco Catch não especifica um tipo de erro. O segundo bloco Catch lida com todos os outros erros de finalização que ocorrem.

Windows PowerShell corresponde a tipos de erro por herança. Um bloco Catch lida com os erros da classe de exceção do .NET Framework especificada ou de qualquer classe que deriva da classe especificada. O exemplo a seguir contém um bloco Catch 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 detecta um erro de comando não encontrado:

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

Esse bloco Catch 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 bloco Catch para a classe derivada antes do bloco Catch para a classe geral.

LIBERAÇÃO DE RECURSOS USANDO FINALLY

Para liberar recursos usados por um script, adicione um bloco Finally após os blocos Try e Catch. As declarações do bloco Finally são executadas, independentemente de o bloco Try encontrar um erro de terminação. Windows PowerShell executa o bloco Finally antes do script terminar ou antes do bloco atual sair do escopo.

Um bloco Finally é executado mesmo se você usar CTRL + C para interromper o script. Um bloco Finally também é executado se uma palavra-chave de saída para o script de um bloco Catch.

CONSULTE TAMBÉM

about_Break

about_Continue

about_Scopes

about_Throw

about_Trap