
No início deste curso, analisamos o tratamento de erros usando as instruções TRY, CATCH e ENDTRY. Após a instrução TRY vem a instrução que pode causar um erro. Se o erro ocorrer, o sistema salta para a instrução CATCH e processa o respectivo conteúdo. O que quer que aconteça, o método continua o processamento após a instrução ENDTRY.

Em um bloco TRY…ENDTRY, você pode incluir mais de uma instrução CATCH. Isso permite que você trate diferentes exceções de forma diferente.

Você pode listar várias exceções em uma única instrução CATCH. Neste exemplo, o mesmo bloco CATCH será processado se o sistema acionar cx_sy_arithmetic_error ou cx_sy_zerodivide.

Quando você lista uma classe em uma instrução CATCH, o sistema processará o bloco correspondente se uma exceção com essa classe ou uma de suas subclasses for acionada. Neste exemplo, cx_sy_arithmetic_error é uma classe superior de cx_sy_arithmetic_overflow e cx_sy_zerodivide. Em simultâneo, o bloco será processado se for criada uma exceção com o tipo de uma das subclasses.

Todas as classes de exceção fazem parte de uma hierarquia de herança cuja classe superior superior é a classe cx_root. Como já vimos, se você utilizar uma classe superior em uma instrução CATCH, o sistema irá para ela se uma exceção com o tipo de qualquer uma de suas subclasses for acionada. Uma vez que todas as classes de exceção são subclasses de cx_root, a instrução CATCH cx_root é suficiente para detectar qualquer exceção.
Sequência de instruções CATCH

Quando você escreve instruções CATCH, deve colocar primeiro a classe (ou classes) mais específicas e as mais genéricas por último. Se você colocar uma classe superior acima de uma de suas subclasses, causará um erro de sintaxe. Isso ocorre porque o sistema não conseguiu processar o bloco CATCH específico porque ele é ofuscado pelo mais genérico.
O suplemento INTO
Cada exceção é representada por um objeto. Você pode colocar esse objeto em uma variável de referência e trabalhar com ele - por exemplo, para recuperar o texto de erro da classe de exceção usando o método get_text( ), como mostrado no exemplo aqui.

Você pode utilizar uma declaração inline na instrução CATCH para garantir que a variável de referência seja declarada com o tipo correto.
A coisa mais comum a ver com o objeto de exceção é chamar seu método get_text( ). No entanto, os objetos de exceção podem ter outros atributos e métodos para ajudar você a tratar o erro.

As classes de exceção podem ter atributos que descrevem com mais precisão o que deu errado. Esses atributos são frequentemente utilizados para preencher os caracteres de preenchimento de mensagens. Você define um atributo na seção pública da classe de exceção com o respectivo nome e tipo adequados.
Para preencher um atributo quando a exceção é criada, você precisa de um parâmetro de importação correspondente do construtor da classe de exceção. Você pode gerar este parâmetro de importação utilizando uma correção rápida. Posicione o cursor no nome do método constructor e pressione Ctrl + 1. Escolha a correção rápida Regerar construtor.
Propagação de exceções

Um método pode propagar uma exceção ao longo da cadeia de chamadas. Em vez de usar a instrução CATCH para tratar a exceção, o método inclui a cláusula RAISING em sua definição. Isso indica aos chamadores do método que a exceção pode ser transferida para eles.
Se a exceção não for detectada em nenhum lugar ao longo da cadeia de chamadas, ocorrerá um erro em tempo de execução.
O atributo previous
Às vezes, dentro de uma cadeia de chamadas, um método interceptará uma exceção e, em resposta, ele levantará uma exceção diferente para seu próprio chamador pegar. Isso pode acontecer, por exemplo, se um framework criar uma exceção muito orientada tecnicamente para a aplicação processar. O método que aciona sua própria exceção pode transferir a primeira exceção. Isso pode ser efetuado utilizando o atributo previous da classe de exceção.

Quando você dispara uma exceção, pode transferir uma instância de uma classe de exceção para o parâmetro de importação previous. Isso anexa o objeto de exceção à nova exceção. Um método que captura a segunda exceção pode acessar o primeiro objeto de exceção usando o atributo público protegido contra gravação previous.
Como previous está implementado na classe superior cx_root, ele está disponível em todas as classes de exceção.