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("http://www.contoso.com/MyDoc.doc") } catch [System.Net.WebException],[System.IO.IOException] { "Não é possível baixar MyDoc.doc de http://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