{"id":2211,"date":"2015-07-06T02:02:33","date_gmt":"2015-07-06T05:02:33","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=2211"},"modified":"2015-07-06T02:02:33","modified_gmt":"2015-07-06T05:02:33","slug":"excecoes-do-java-sao-uteis-talvez-voce-e-que-nao-saiba-usa-las","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=2211","title":{"rendered":"Exce\u00e7\u00f5es do Java s\u00e3o \u00fateis: talvez voc\u00ea \u00e9 que n\u00e3o saiba us\u00e1-las"},"content":{"rendered":"<p>Semana passada <a title=\"Java \u00e9 simples: voc\u00ea que burocratiza seus projetos\" href=\"https:\/\/devkico.itexto.com.br\/?p=2208\">escrevi<\/a> sobre como os programadores complicam o c\u00f3digo Java. Volto este tema agora para falar um pouco sobre um recurso extremamente \u00fatil da linguagem que, acredito, \u00e9 muito mal compreendido: as exceptions.<\/p>\n<h2>Uma vis\u00e3o hist\u00f3rica<\/h2>\n<p>Acredito que para dominar uma linguagem de programa\u00e7\u00e3o um dos primeiros passos que devemos tomar \u00e9 buscar entender o que motivou e quais princ\u00edpios guiaram sua cria\u00e7\u00e3o. Uma abordagem hist\u00f3rica cai muito bem neste momento, sendo assim recomendo que voc\u00ea leia o cap\u00edtulo sobre exce\u00e7\u00f5es tal como redigido na especifica\u00e7\u00e3o do Java 1.0, acess\u00edvel neste <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/aa277910(v=vs.60).aspx\">link<\/a>\u00a0(observem a ironia).<\/p>\n<p>A leitura desta especifica\u00e7\u00e3o \u00e9\u00a0<strong>muito<\/strong> interessante, especialmente quando vemos de forma expl\u00edcita os principais objetivos dos designers na cria\u00e7\u00e3o da linguagem naquele momento:\u00a0<em>prover portabilidade e robustez<\/em>. Ao falarmos de exce\u00e7\u00f5es o que realmente nos interessa \u00e9 o segundo princ\u00edpio. Como esta robustez \u00e9 obtida?<\/p>\n<p>Antes um pouco de sem\u00e2ntica: uma exception, como o pr\u00f3prio nome j\u00e1 nos diz, denota uma condi\u00e7\u00e3o anormal que ocorre durante o fluxo de execu\u00e7\u00e3o dos nossos programas.<\/p>\n<p>&nbsp;<\/p>\n<h3>A vida sem exceptions<\/h3>\n<p>Muitas linguagens de programa\u00e7\u00e3o simplesmente finalizam a execu\u00e7\u00e3o do software (pense em C ou Pascal) quando algo assim ocorre e n\u00e3o h\u00e1 alguma forma de tratamento do erro padronizada, outra alternativa \u00e9 apenas retornar um c\u00f3digo de erro que pode facilmente ser ignorado pelo programador (pense na fun\u00e7\u00e3o <strong><a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/wyssk1bs.aspx\">read<\/a><\/strong><a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/wyssk1bs.aspx\"> do C <\/a>retornando o valor -1, por exemplo).<\/p>\n<p>Vamos a um exemplo r\u00e1pido usando &#8220;pseudo C&#8221;. A linguagem possu\u00ed uma fun\u00e7\u00e3o chamada read (mencionada acima) que l\u00ea bytes em uma fonte de dados e a armazena em um buffer. Ela retorna o valor -1 caso algo de errado ocorra, 0 se chegamos ao final do arquivo e um valor positivo nos informando quantos bytes foram lidos. Veja o c\u00f3digo abaixo:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nchar buffer&#x5B;128];\r\nread(arquivo, buffer, 128);\r\nprintf(&quot;Serei impresso?&quot;);\r\n\/\/ opera\u00e7\u00f5es importantes seriam executadas na sequ\u00eancia\r\n<\/pre>\n<p>Este \u00e9 um c\u00f3digo muito comum: o programador espera que o arquivo\u00a0<strong>sempre<\/strong> exista, sendo assim, possu\u00ed a &#8220;certeza&#8221; de que a sa\u00edda &#8220;Serei impresso?&#8221; sempre ir\u00e1 ser exposta em seu terminal. Mas nem sempre \u00e9 assim: e se o arquivo imagin\u00e1rio sumir? Nosso ing\u00eanuo programador ir\u00e1 enfrentar problemas pois a execu\u00e7\u00e3o do seu programa terminaria em algum ponto ap\u00f3s esta impress\u00e3o.<\/p>\n<p>Talvez nosso programador pudesse escrever o c\u00f3digo acima de uma forma diferente tal como no exemplo a seguir:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nchar buffer&#x5B;128];\r\nint resultadoLeitura = read(arquivo, buffer, 128);\r\nif (resultadoLeitura &lt; 0) {\r\n\u00a0 \u00a0 \u00a0\/\/ tento corrigir a situa\u00e7\u00e3o aqui\r\n}\r\n<\/pre>\n<p>\u00c9 uma alternativa, o c\u00f3digo se tornou mais robusto, mas\u00a0sua leitura\u00a0n\u00e3o torna\u00a0claro <strong>o que de fato ocorreu<\/strong>\u00a0para termos um erro. O arquivo foi apagado? Seria um problema de permiss\u00e3o? Ainda pior: o c\u00f3digo que motivou a escrita do programa, o fluxo principal (em condi\u00e7\u00f5es ideais de temperatura e press\u00e3o) agora se encontra mesclado ao c\u00f3digo de tratamento de erros.<\/p>\n<p>Java veio com uma solu\u00e7\u00e3o mais interessante. Visto que nossas classes s\u00e3o uma interface, por que n\u00e3o alertar\u00a0seus clientes a respeito do que pode dar errado e, ainda melhor: for\u00e7a-los a tratar estas situa\u00e7\u00f5es (o problema est\u00e1 neste &#8220;for\u00e7a-los&#8221;)?<\/p>\n<h2>Pensando como Gosling, Joy e Steele<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-2213\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2015\/07\/java_language_spec-239x300.jpg\" alt=\"java_language_spec\" width=\"169\" height=\"212\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2015\/07\/java_language_spec-239x300.jpg 239w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2015\/07\/java_language_spec.jpg 260w\" sizes=\"(max-width: 169px) 100vw, 169px\" \/><\/p>\n<h3>Clareza na escrita<\/h3>\n<p>Por mais incr\u00edvel que possa parecer a diversos cr\u00edticos atuais da linguagem, naquela \u00e9poca um dos objetivos era ter c\u00f3digo menos verboso. O ideal \u00e9 que o programador pudesse ver o fluxo principal do seu programa de uma forma simples, e o tratamento dos erros isoladamente, tal como no exemplo a seguir:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nString conteudoArquivo(File arquivo) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 try {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ meu fluxo principal entra aqui\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } catch (FileNotFoundException\u00a0ex) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ o que eu fa\u00e7o se o arquivo n\u00e3o existir?\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0} catch (EOFException ex) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ e se o arquivo chegar ao fim antes do imaginado?\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0} catch (IOException ex) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ e se for algum outro erro de I\/O que n\u00e3o previ e\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ n\u00e3o seja como os que mostrei antes?\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n}\r\n<\/pre>\n<p>\u00c9 interessante como agora voc\u00ea sabe\u00a0<strong>o qu\u00ea<\/strong> pode ter dado errado, e consegue diferenciar de forma clara como tratar cada uma daquelas situa\u00e7\u00f5es. Ainda melhor: o que realmente importa, o fluxo principal, est\u00e1 claramente isolado.<\/p>\n<p>Uma exception \u00e9 na realidade um desvio de fluxo. Talvez voc\u00ea lide com erros do tipo FileNotFound e IOException da mesma forma. Neste caso, como a primeira exception \u00e9 uma subclasse da segunda, basta colocar um \u00fanico bloco catch para esta.<\/p>\n<h3>Exceptions como contrato<\/h3>\n<p>&nbsp;<\/p>\n<p>Mais do que isto, acredito que muitos programadores simplesmente n\u00e3o saibam interpretar o c\u00f3digo que encontram: imagine uma declara\u00e7\u00e3o de m\u00e9todo como a abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nvoid processeArquivos(File&#x5B;] arquivos) throws FileNotFoundException\r\n<\/pre>\n<p>O m\u00e9todo me diz:<\/p>\n<blockquote><p>&#8220;Recebo uma lista de arquivos em uma matriz como par\u00e2metro.\u00a0Conseguirei executar meu trabalho quando todos os arquivos forem acess\u00edveis a mim. Se me passar algum deles que n\u00e3o seja, repasso a voc\u00ea, que me chamou, a responsabilidade de lidar com este problema para mim.&#8221;<\/p><\/blockquote>\n<p>O m\u00e9todo, \u00e9 um\u00a0<em>contrato<\/em>, e a exception, uma valida\u00e7\u00e3o de que o mesmo ser\u00e1 cumprido. Se n\u00e3o for o caso, o fluxo dever\u00e1 ser alterado para que o seja ou a responsabilidade para se resolver o problema, repassada a outro objeto (talvez o cliente do cliente).<\/p>\n<p>Mais do que isto: um contrato v\u00e1lido \u00e9 aquele bem definido. Fica f\u00e1cil perceber quando quem escreveu o c\u00f3digo n\u00e3o tem muita ideia a respeito do que est\u00e1 fazendo. Observe a declara\u00e7\u00e3o de m\u00e9todo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nvoid processeArquivos(File&#x5B;] arquivos) throws Throwable\r\n<\/pre>\n<p>O que este m\u00e9todo me diz?<\/p>\n<blockquote><p>&#8220;Recebo uma lista de arquivos para serem processados, alguma coisa pode dar errado, mas n\u00e3o sei o que.&#8221;<\/p><\/blockquote>\n<p>Temos um meio contrato aqui: apenas sabemos que devemos enviar arquivos para este m\u00e9todo. N\u00e3o sei se todos devem realmente estar acess\u00edveis, apenas os envio.<\/p>\n<h3>Exceptions checadas e n\u00e3o checadas. Pra qu\u00ea?<\/h3>\n<p>Por que h\u00e1 as tais &#8220;checked exceptions&#8221; e &#8220;unchecked exceptions&#8221;? O que diferencia uma de outra? Uma interpreta\u00e7\u00e3o r\u00e1pida seria:<\/p>\n<blockquote><p>&#8220;Checked exception \u00e9 aquela que \u00e9 uma subclasse de java.lang.Exception e que, se eu disparar no corpo do meu m\u00e9todo, tenho de incluir uma clausula throws. A outra n\u00e3o, eu apenas a disparo l\u00e1 dentro e n\u00e3o aviso ningu\u00e9m a respeito pois \u00e9 uma subclasse de RuntimeException ou Error.&#8221;<\/p><\/blockquote>\n<p>O que n\u00e3o responde quase nada al\u00e9m de expor uma hierarquia de classes incompleta. A resposta \u00e9 mais simples: h\u00e1 erros que s\u00e3o trat\u00e1veis e outros nem tanto. Erros trat\u00e1veis s\u00e3o aqueles que definem um contrato e os clientes conseguem ao menos tentar resolve-los\u00a0quando ocorrem.<\/p>\n<p>Por exemplo: um arquivo inacess\u00edvel \u00e9 um erro trat\u00e1vel. Se topei com um erro do tipo FileNotFound, talvez seja poss\u00edvel criar um novo arquivo\u00a0para em seguida chamar aquela fun\u00e7\u00e3o ou procedimento novamente.<\/p>\n<p>Por outro lado, se houver um crash do meu sistema operacional ou meu sistema de arquivos desaparecer, n\u00e3o h\u00e1 muito o que eu possa fazer. \u00c9 um erro de tempo de execu\u00e7\u00e3o (runtime). E a quantidade de problemas deste tipo que podem ocorrer \u00e9 praticamente infinita: seu HD pode pegar fogo, ou seu HD pode ser removido, ou seu sistema operacional pode desaparecer, ou sua rede pode se tornar inacess\u00edvel, ou algu\u00e9m pode desligar o servidor, ou&#8230;.<\/p>\n<p>Por que as exce\u00e7\u00f5es do tipo Runtime n\u00e3o s\u00e3o &#8220;checked&#8221;? Vou pedir para Gosling, Joy e Steele uma for\u00e7a. Veja o que \u00e9 dito na se\u00e7\u00e3o <a href=\"http:\/\/titanium.cs.berkeley.edu\/doc\/java-langspec-1.0\/11.doc.html#44149\">11.2.2 da especifica\u00e7\u00e3o<\/a>:<\/p>\n<blockquote><p>&#8220;A informa\u00e7\u00e3o dispon\u00edvel para o compilador Java, e o n\u00edvel de an\u00e1lise que este executa, raramente s\u00e3o \u00a0suficientes para se descobrir\u00a0que erros de tempo de execu\u00e7\u00e3o poder\u00e3o ocorrer, mesmo sendo \u00f3bvio para o programador. Obrigar o programador a declarar todas estas exce\u00e7\u00f5es seria apenas uma tarefa irritante para o desenvolvedor.&#8221; (tradu\u00e7\u00e3o minha)<\/p><\/blockquote>\n<p>\u00c9 interessante tamb\u00e9m ver o que os autores dizem na especifica\u00e7\u00e3o ao nos dizerem<a href=\"http:\/\/titanium.cs.berkeley.edu\/doc\/java-langspec-1.0\/11.doc.html#44147\"> por que a outra categoria de erros (java.lang.Error) n\u00e3o s\u00e3o checados<\/a>\u00a0(11.2.1):<\/p>\n<blockquote><p>&#8220;S\u00e3o problemas que podem ocorrer em in\u00fameros pontos de um programa e cuja solu\u00e7\u00e3o \u00e9 dif\u00edcil ou imposs\u00edvel. Um programa escrito em Java que precisasse lidar com todos estes erros seria uma zona e sem sentido algum&#8221; (tradu\u00e7\u00e3o minha)<\/p><\/blockquote>\n<p>Sendo assim, ao inv\u00e9s de obrigar o desenvolvedor a tratar\u00a0<strong>cada um<\/strong> destes problemas, por que n\u00e3o for\u00e7a-lo a lidar apenas com o que <b>pode ser tratado<\/b>? Este \u00e9 um dos principais motivadores: te for\u00e7ar a escrever menos c\u00f3digo e, quem sabe, escrever c\u00f3digo de melhor qualidade.<\/p>\n<p>Isto n\u00e3o quer dizer que voc\u00ea deva escrever c\u00f3digo como o a seguir:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\ntry {\r\n\u00a0 \u00a0 \/\/ aqui est\u00e1 meu fluxo principal\r\n} catch (Throwable t) {\r\n\u00a0 \u00a0 \/\/ aqui lidarei com todos os problemas poss\u00edveis e imposs\u00edveis\r\n\u00a0 \u00a0 \/\/ dos multiversos\r\n}\r\n<\/pre>\n<p>Quando escrevemos algo como &#8220;catch (Throwable)&#8221; estamos com uma das seguintes ideias na cabe\u00e7a:<\/p>\n<ul>\n<li>Vou ignorar qualquer tipo de erro que venha a ocorrer.<br \/>\n(me faz lembrar do &#8220;<a href=\"https:\/\/msdn.microsoft.com\/pt-br\/library\/5hsw66as.aspx\">on error resume next<\/a>&#8221; do VB)<\/li>\n<li>Todos os erros s\u00e3o iguais, sendo assim os tratarei todos da mesma forma.<\/li>\n<\/ul>\n<p>Se um dos princ\u00edpios norteadores da cria\u00e7\u00e3o do Java foi a robustez, e estamos usando\u00a0Java (ignore sua linguagem favorita por um momento), escrever c\u00f3digo deste tipo \u00e9 corromper a linguagem e se induzir ao erro.<\/p>\n<p>Mais do que isto: checked exceptions permitem ao\u00a0<strong>compilador<\/strong> verificar se voc\u00ea est\u00e1 lidando com as situa\u00e7\u00f5es an\u00f4malas definidas no contrato das suas interfaces.<\/p>\n<h2>Como uso bem as exce\u00e7\u00f5es?<\/h2>\n<p>O principal motivador para a escrita deste post s\u00e3o as cr\u00edticas que ou\u00e7o a respeito do modo como a linguagem Java lida com exce\u00e7\u00f5es. \u00c9 interessante como muitas pessoas se esquecem que o recurso foi inclu\u00eddo na linguagem para facilitar a vida do programador, e n\u00e3o complic\u00e1-la.<\/p>\n<p>Curiosamente, a esmagadora maioria das cr\u00edticas que vejo s\u00e3o motivadas pelo mal uso ou compreens\u00e3o do recurso. Sendo assim, seguem algumas dicas:<\/p>\n<ul>\n<li>Pense na declara\u00e7\u00e3o de exce\u00e7\u00f5es como a defini\u00e7\u00e3o de um contrato bem definido: elas definem premissas, ou seja, aquilo que\u00a0<strong>n\u00e3o deve ocorrer<\/strong> para que o c\u00f3digo possa ser executado com sucesso.<\/li>\n<li>Tire proveito da precis\u00e3o: um &#8220;catch (Throwable)&#8221; n\u00e3o te possibilita lidar com as diferentes situa\u00e7\u00f5es ou quebras de contrato que podem ocorrer durante a execu\u00e7\u00e3o do sistema, voc\u00ea estar\u00e1 apenas criando um bloco catch que, no futuro, pode se tornar um verdadeiro monstrinho.<\/li>\n<li>Entenda a diferen\u00e7a entre checked e unchecked exceptions.<\/li>\n<li>Uma declara\u00e7\u00e3o de m\u00e9todo que cont\u00e9m uma instru\u00e7\u00e3o throws seguida de 293847 tipos de exce\u00e7\u00e3o e algo como um &#8220;throws Throwable&#8221; s\u00e3o a mesma coisa.<\/li>\n<li>Se checked exceptions s\u00e3o um problema para voc\u00ea, considere linguagens como Groovy que torna o tratar de exce\u00e7\u00f5es uma tarefa opcional<\/li>\n<\/ul>\n<p>Espero com este texto ter clarificado alguns pontos a respeito de um dos aspectos mais interessantes da linguagem Java.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Semana passada escrevi sobre como os programadores complicam o c\u00f3digo Java. Volto este tema agora para falar um pouco sobre um recurso extremamente \u00fatil da linguagem que, acredito, \u00e9 muito mal compreendido: as exceptions. Uma vis\u00e3o hist\u00f3rica Acredito que para dominar uma linguagem de programa\u00e7\u00e3o um dos primeiros passos que devemos tomar \u00e9 buscar entender [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":512,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-2211","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Exce\u00e7\u00f5es do Java s\u00e3o \u00fateis: talvez voc\u00ea \u00e9 que n\u00e3o saiba us\u00e1-las - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=2211\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Exce\u00e7\u00f5es do Java s\u00e3o \u00fateis: talvez voc\u00ea \u00e9 que n\u00e3o saiba us\u00e1-las - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Semana passada escrevi sobre como os programadores complicam o c\u00f3digo Java. Volto este tema agora para falar um pouco sobre um recurso extremamente \u00fatil da linguagem que, acredito, \u00e9 muito mal compreendido: as exceptions. Uma vis\u00e3o hist\u00f3rica Acredito que para dominar uma linguagem de programa\u00e7\u00e3o um dos primeiros passos que devemos tomar \u00e9 buscar entender [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=2211\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2015-07-06T05:02:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/10\/java_logo_2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"250\" \/>\n\t<meta property=\"og:image:height\" content=\"332\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2211\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=2211\",\"name\":\"Exce\u00e7\u00f5es do Java s\u00e3o \u00fateis: talvez voc\u00ea \u00e9 que n\u00e3o saiba us\u00e1-las - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2211#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2211#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/10\/java_logo_2.png\",\"datePublished\":\"2015-07-06T05:02:33+00:00\",\"dateModified\":\"2015-07-06T05:02:33+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2211#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=2211\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2211#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/10\/java_logo_2.png\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/10\/java_logo_2.png\",\"width\":250,\"height\":332},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2211#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Exce\u00e7\u00f5es do Java s\u00e3o \u00fateis: talvez voc\u00ea \u00e9 que n\u00e3o saiba us\u00e1-las\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Exce\u00e7\u00f5es do Java s\u00e3o \u00fateis: talvez voc\u00ea \u00e9 que n\u00e3o saiba us\u00e1-las - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=2211","og_locale":"pt_BR","og_type":"article","og_title":"Exce\u00e7\u00f5es do Java s\u00e3o \u00fateis: talvez voc\u00ea \u00e9 que n\u00e3o saiba us\u00e1-las - \/dev\/Kico","og_description":"Semana passada escrevi sobre como os programadores complicam o c\u00f3digo Java. Volto este tema agora para falar um pouco sobre um recurso extremamente \u00fatil da linguagem que, acredito, \u00e9 muito mal compreendido: as exceptions. Uma vis\u00e3o hist\u00f3rica Acredito que para dominar uma linguagem de programa\u00e7\u00e3o um dos primeiros passos que devemos tomar \u00e9 buscar entender [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=2211","og_site_name":"\/dev\/Kico","article_published_time":"2015-07-06T05:02:33+00:00","og_image":[{"width":250,"height":332,"url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/10\/java_logo_2.png","type":"image\/png"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=2211","url":"https:\/\/devkico.itexto.com.br\/?p=2211","name":"Exce\u00e7\u00f5es do Java s\u00e3o \u00fateis: talvez voc\u00ea \u00e9 que n\u00e3o saiba us\u00e1-las - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2211#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2211#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/10\/java_logo_2.png","datePublished":"2015-07-06T05:02:33+00:00","dateModified":"2015-07-06T05:02:33+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2211#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=2211"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=2211#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/10\/java_logo_2.png","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/10\/java_logo_2.png","width":250,"height":332},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=2211#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Exce\u00e7\u00f5es do Java s\u00e3o \u00fateis: talvez voc\u00ea \u00e9 que n\u00e3o saiba us\u00e1-las"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/10\/java_logo_2.png","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2211"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2211"}],"version-history":[{"count":5,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2211\/revisions"}],"predecessor-version":[{"id":2217,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2211\/revisions\/2217"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/media\/512"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}