-
Title:
06x-03 Exceptional Control Flow
-
Description:
06x-03 Controle de Fluxo de Exceções
-
Em nosso interpretador JavaScript, usamos exceções para implementar comandos return.
-
Isso é ruim? Deveríamos usar Python se temos que fazer isso?
-
Bem, existe muito tratamento de exceção, no nível de linguagem, no mundo real.
-
Eu não acho que isso seja uma razão para evitar Python ou para argumentar que uma linguagem é mais perigosa que outra.
-
Tratamento de exceção no nível de linguagem é super popular.
-
De fato, isso vem desde Goodenough, que em 1975 introduziu o modelo de sunstituição --
-
esse é uim sobrenome super interessante, eu gostaria de ter um assim.
-
E desde então, um grande número de linguagens possibilita tratar erros em programas,
-
e questões relacionadas a ambientes, e ambos caem na categoria de
-
exceções, no nível de linguagem. E isso realmente é muito útil, poque a abordagem anterior
-
envolvia atribuir e verificar valores de flags globais, e programadores não são muito bons
-
em se lembrar de fazer isso de maneira coerente e correta.
-
Mesmo com tratamento de exceções no nível de linguagem, programadores ainda comentem muitos erros.
-
Minha explicação pessoal é que isso é devido ao fato de que o controle de fluxo
-
para tratamento de exceção não é visível.
-
Quando você olha para um código Python, você pode dizer que o controle do fluxo pula para a próxima linha,
-
se esta linha está identada em relação ao comando corrente.
-
Mas exceções representam um certo tipo de desvio não local, para algum outro lugar,
-
e a identação do código, ou a estrutura do código, não deixa isso claro.
-
E se você não percebe que o código pode desviar de uma linha para outra,
-
você pode esquecer-se de restabelecer algum invariante, ou de fechar um arquivo importante,
-
ou de finalizar uma estrutura no final.
-
De fato, há alguns anos atrás, quendo que estava fazendo minha dissertação nessa área --
-
oh, trágicamente entediante -- notei que programadores de código aberto tendem a
-
cometer da ordem de 800 erros por 4 milhões de linhas de código, relacionados apenas a tratamento de exceções.
-
De fato, tratamento de exceção é tão proeminente que, se você olhar para um programa típico,
-
algo entre 1% a 5% do texto desse programa consiste de blocos catch e finally.
-
Isso pode parecer pouco, mas, tipicamente, um bloco catch ou finally, se não for simplesmente vazio,
-
irá chamar alguma outra rotina de tratamento de erro, e grande parte do software, algo entre 3% e 46% do programa,
-
é transitivamente atingível por meio chamadas de métodos ou o que seja,
-
a partir desses locos catch e finally.
-
Se você quizer em escrever grandes trechos de software robusto, que serão disponibilizados no mundo real,
-
você irá gastar um bocado de tempo com tratamento de erros.
-
Tratamento de exceção no nível de linguagem é, pelo menos,
-
muito melhor do que a outra alternativa para isso.
-
Isso seria uma razão para evitar Python?
-
Vimos em aila que podemos usar algo como tratamento de exceção para lidar com
-
a interpretação de comandos return de JavaScript, em nosso interpretador para JavaScript, em Python.
-
Não, eu não evitaria Python por isso.
-
De fato, mesmo linguagens similares, como Java, são potencialmente piores.
-
Você pode não saber, mas Java ainda tem GOTOs -- verifique.
-
Você pode colocar labels no programa e usar o comando break, com um argumento,
-
para simular o comportamento de GOTOs -- mesmo sabendo-se que linguagens nominalmente mais seguras e
-
mais estruturadas devam evitar esse tipo de coisa.
-
Na prática, muitas linguages do mundo real -- seja Python ou Java -- têm seu lado negro,
-
que possibilitam que você escreve código spaghetti.
-
Isso não é apenas o caso de Python ou de JavaScript.
-
Realmente, vem quase dessa questão filosófoca de que, algumas vezes, quando você detecta um erro,
-
você não tem tempo suficiente, ou não tem contexto suficiente, para tratar esse erro.
-
Esta é realmente a motivação para tratamento de exceção.
-
Quando eu estou no meio de algum código de baixo nível que falha ao escrever algo no disco,
-
ou falha ao enviar algo na rede, eu não sei se devo tentar novamente.
-
Porque não? Porque depende do resto da semântica da aplicação.
-
Se for algum tipo de gerência de rede, pode ser que eu deva aguardar por uns 5 segundos e tentar de novo,
-
se for algo como voz sobre IP, como Skype, pode ser que eu não me importe,
-
talvez eu apenas deva esperar pela chegada do próximo pacote.
-
Eu não posso saber, a não ser que eu conheça mais sobre a aplicação.
-
Então, exceções me possibiliram notificar um erro, e esperar que algum outro trecho de código,
-
que possua mais informação, trate o erro. Esse é o caso geral em programação.
-
e não uma situação particular a uma linguagem. Portanto, eu não diria que é um problema de Python, ou Java, ou JavaScript.