(IFC, 2026) Analise os códigos abaixo, disponibilizados nas linguagens Java e Python, que implementam a mesma lógica. Sobre o fluxo de execução com blocos de tratamento de exceções (try-catch/except-finally) e relançamento de exceções, assinale a alternativa que apresenta a saída produzida. Considere que o método/função principal captura a exceção relançada e que o bloco finally é sempre executado antes da propagação da exceção, conforme as especificações oficiais de ambas as linguagens.
class A extends Exception { }
class B extends A { }
public class Teste {
public static void metodo() throws A {
try {
throw new B();
} catch (B e) {
System.out.print("B ");
throw e;
} finally {
System.out.print("F ");
}
}
public static void main(String[] args) {
try {
metodo();
} catch (A e) {
System.out.print("A ");
}
}
}class A(Exception):
pass
class B(A):
pass
def metodo():
try:
raise B()
except B as e:
print("B ", end="")
raise
finally:
print("F ", end="")
if __name__ == "__main__":
try:
metodo()
except A as e:
print("A ", end="")A B F A.
B B A F.
C F B A.
D B F.
E F A.
Para determinar a saída do código, vamos analisar o fluxo de execução passo a passo, seguindo as regras de tratamento de exceções do Java/Python:
metodo().metodo(), o bloco try executa throw new B()/raise B(), levantando uma exceção do tipo B.catch (B e)/except B as e captura essa exceção (pois o tipo corresponde exatamente).print é executado, imprimindo "B".throw/raise relança a mesma exceção B que estava sendo tratada.finally é sempre executado. Assim, print é executado, imprimindo "F".B se propaga para o escopo de chamada.catch (A e)/except A as e verifica se pode capturar a exceção. Como a classe B herda de A, uma exceção do tipo B é uma instância de A (polimorfismo por subtipo). Portanto, a exceção é capturada com sucesso.print é executado, imprimindo "A".Conforme exposto, a resposta correta é:
A B F A.