Em várias linguagens (pelo menos em Java, pense também em C #?), Você pode fazer coisas como
if( condition )
singleStatement;
while( condition )
singleStatement;
for( var; condition; increment )
singleStatement;
Portanto, quando tenho apenas uma declaração, não preciso adicionar um novo escopo { }
. Por que não posso fazer isso com try-catch?
try
singleStatement;
catch(Exception e)
singleStatement;
Existe algo especial no try-catch que exige sempre um novo escopo ou algo assim? E se sim, o compilador não poderia consertar isso?
for
as partes deve ser nomeado algo comoinitial
,condition
estep
comoinitial
não precisa definir uma variável estep
não precisa ser um incremento.if
é sempre uma única declaração, e várias declarações entre chaves incluem uma única declaração. Mas eu sou um daqueles que sempre colocam o aparelho de qualquer maneira, então ...throw
ereturn
, e como @detly disse, se você considerar os aparelhos como um único grupo de instruções, não o acho. inconsistente também. Eu nunca entendi o que são esses "muitos erros de codificação" mencionados pelas pessoas. As pessoas precisam começar a prestar atenção ao que eles fazem, usar recuo adequado e ter testes de unidade: P nunca tive um problema com isso ...Respostas:
IMO, eles estão incluídos em Java e C # principalmente porque já existiam em C ++. A verdadeira questão, então, é por que o C ++ é assim. De acordo com o Design e a evolução do C ++ (§16.3):
Edit: Por que isso seria confuso, acho que é preciso apenas olhar para as afirmações incorretas na resposta de Tom Jeffery (e, principalmente, o número de votos recebidos) para perceber que haveria um problema. Para o analisador, isso realmente não é diferente de combinar
else
s comif
s - faltando chaves para forçar outro agrupamento, todas ascatch
cláusulas corresponderiam às mais recentesthrow
. Para aqueles idiomas desonestos que o incluem, asfinally
cláusulas fazem o mesmo. Do ponto de vista do analisador, isso dificilmente é diferente da situação atual para notar - em particular, como as gramáticas estão atualmente, não há realmente nada para agrupar ascatch
cláusulas - os colchetes agrupam as declarações controladas pelocatch
cláusulas catch, não as próprias cláusulas catch.Do ponto de vista de escrever um analisador, a diferença é quase pequena demais para se notar. Se começarmos com algo assim:
Então a diferença seria entre:
e:
Da mesma forma, para cláusulas de captura:
vs.
A definição de um bloco completo de tentativa / captura não precisaria ser alterada. De qualquer forma, seria algo como:
[Aqui estou usando
[whatever]
para indicar algo opcional, e estou deixando de fora a sintaxe por um tempo,finally_clause
pois acho que isso não tem nenhuma relação com a questão.]Mesmo se você não tentar seguir toda a definição gramatical semelhante ao Yacc, o ponto pode ser resumido com bastante facilidade: essa última declaração (começando com
try_block
) é aquela em que ascatch
cláusulas são correspondidas àstry
cláusulas - e permanece exatamente o mesmo se as chaves são necessárias ou não.Para reiterar / resumir: o grupo de chaves em conjunto as declarações controladas por os
catch
s, mas fazer não agrupar acatch
si s. Como tal, esses aparelhos não têm absolutamente nenhum efeito sobre a decisão de qualcatch
vai com qualtry
. Para o analisador / compilador, a tarefa é igualmente fácil (ou difícil) de qualquer maneira. Apesar disso, @ resposta de Tom (e o número de up-votos é recebido) fornece ampla demonstração do fato de que tal mudança um faria usuários quase certamente Confuse.fonte
try return g(); catch(xxii) error("G() goofed: xxii");
ainda teria sido limpo IMOEm uma resposta sobre por que os colchetes são necessários para algumas construções de declaração única, mas não para outras , Eric Lippert escreveu:
Em outras palavras, era mais caro para a equipe do compilador implementá-lo do que o justificado, pelo benefício marginal que ele proporcionaria.
fonte
Eu acho que é para evitar outros problemas de estilo. O seguinte seria ambíguo ...
Isso pode significar isso:
Ou...
fonte
if
caso. É fácil dizer "bem, o outro se liga ao mais íntimo se" e acabar com isso. Mas para try / catch que não funciona.Eu acho que o principal motivo é que há muito pouco que você pode fazer em C # que precisaria de um bloco try / catch que seja apenas uma linha. (Eu não consigo pensar em nada agora no topo da minha cabeça). Você pode ter um ponto válido em termos do bloco catch, por exemplo, uma declaração de uma linha para registrar algo, mas em termos de legibilidade, faz mais sentido (pelo menos para mim) exigir {}.
fonte