{"id":2218,"date":"2015-07-07T20:14:42","date_gmt":"2015-07-07T23:14:42","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=2218"},"modified":"2015-07-07T20:14:42","modified_gmt":"2015-07-07T23:14:42","slug":"projete-boas-apis-com-java-exceptions","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=2218","title":{"rendered":"Projete boas APIs com Java exceptions"},"content":{"rendered":"<p>No <a title=\"Exce\u00e7\u00f5es do Java s\u00e3o \u00fateis: talvez voc\u00ea \u00e9 que n\u00e3o saiba us\u00e1-las\" href=\"https:\/\/devkico.itexto.com.br\/?p=2211\">meu \u00faltimo post<\/a>\u00a0falei um pouco sobre um dos meus recursos favoritos do Java que s\u00e3o as <em>exceptions<\/em>. L\u00e1 falei um pouco sobre como as exce\u00e7\u00f5es nos ajudam a pensar <em>contratos<\/em>, mas agora gostaria de ir um pouco al\u00e9m. Agora vou mostrar como tornar suas APIs muito mais ricas usando exceptions.<\/p>\n<h2>Mas o que \u00e9 uma API mesmo?<\/h2>\n<p>N\u00e3o vou dourar a p\u00edlula,\u00a0sendo assim vou definir de uma forma bem direta:<\/p>\n<blockquote><p>\u00e9 a parte execut\u00e1vel do seu programa que voc\u00ea ir\u00e1 expor a outros programadores para que eles a\u00a0executem<\/p><\/blockquote>\n<p>Repare que n\u00e3o usei a palavra &#8220;sistema&#8221; aqui, mas sim &#8220;programa&#8221;. Quando voc\u00ea\u00a0projeta uma classe que possuir\u00e1 m\u00e9todos p\u00fablicos, pensados para que outros programadores a usem, voc\u00ea est\u00e1 criando uma API (mesmo que voc\u00ea seja este outro programador).<\/p>\n<p><em>Existe algum programa que n\u00e3o crie uma API Kico?<\/em> Yeap: pense nos scripts que voc\u00ea escreve para automatizar suas tarefas. \u00c9 aquele tipo de programa que voc\u00ea apenas quer que seja executado. Softwares feitos <strong>apenas para uso direto<\/strong> normalmente n\u00e3o exp\u00f5em uma API.<\/p>\n<p><em>Ah, mas a\u00ed, se outro programa o chamar, eu posso dizer que aquilo ali \u00e9 uma API?<\/em> A\u00ed voc\u00ea relativizou a coisa e este post n\u00e3o sai. :)<\/p>\n<p>Falaremos aqui n\u00e3o de APIs REST, mas sim aquela que se manifesta sob a forma de c\u00f3digo execut\u00e1vel, ou seja, os m\u00e9todos p\u00fablicos que voc\u00ea declara em suas classes ou os abstratos em suas interfaces.<\/p>\n<h2>O que \u00e9 uma boa API?<\/h2>\n<p>Uma boa API \u00e9 aquela que nos diz exatamente o que ser\u00e1 feito. Tudo come\u00e7a a partir do nome escolhido pelo programador\u00a0para aquele m\u00e9todo, que dever\u00e1 expor de forma evidente a <em>inten\u00e7\u00e3o<\/em> daquele c\u00f3digo.<\/p>\n<p>Um bom nome j\u00e1 nos deu boa parte\u00a0do que precisamos, o segundo componente s\u00e3o os par\u00e2metros que a API espera. Idealmente devem ser poucos e com uma granularidade adequada. Vamos come\u00e7ar com um exemplo simples que iremos ir melhorando durante o post (sim, \u00e9 c\u00f3digo real):<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nint cadastrarPessoa(int id, String nome, String sobrenome, Date dataNascimento)\r\n<\/pre>\n<p>Reparou como a granularidade est\u00e1 errada? Por que n\u00e3o simplesmente passar um objeto do tipo Pessoa a ser persistido,\u00a0tal como a vers\u00e3o melhorada que mostrarei a seguir? Ainda n\u00e3o \u00e9 uma API perfeita, mas \u00e9 inegavelmente mais simples (e o programador sofre menos no momento em que for digitar seu c\u00f3digo):<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nclass Pessoa {\r\nint cadastrarPessoa(Pessoa pessoa) (...)\r\n}\r\n<\/pre>\n<p>H\u00e1 outro aspecto na API que deve ser levado em considera\u00e7\u00e3o: o tipo de retorno. Nossa vers\u00e3o anterior retorna um valor inteiro, que representa o identificador do registro no banco de dados. Se houver um erro, ela poderia simplesmente nos retornar um valor negativo: &#8220;-1: sem id, -2: sem nome, -3: sem sobrenome&#8221; e por a\u00ed vai. O valor de retorno ter\u00e1 ent\u00e3o duplo sentido: o \u00f3bvio (retornar o identificador) e identificar um erro (quebra de contrato).<\/p>\n<p>Um cliente da API ent\u00e3o escreveria c\u00f3digo similar ao exposto a seguir para lidar com erros:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nswitch (cadastrarPessoa(pessoa) {\r\ncase -1:\r\nSystem.out.println(&quot;Opa! Sem o ID que deve ser preenchido antes!&quot;);\r\nbreak;\r\ncase -2:\r\n(...)\r\n}\r\n<\/pre>\n<p>Sofrimento eterno que poderia ser um pouco aliviado\u00a0incluindo algumas constantes, mas ainda seria um sofrimento eterno.\u00a0Vimos alguns bons pontos na defini\u00e7\u00e3o de uma API:<\/p>\n<ul>\n<li>Um bom nome<\/li>\n<li>Uma boa defini\u00e7\u00e3o de par\u00e2metros<\/li>\n<li>Um valor de retorno que seja significativo (e possua uma \u00fanica fun\u00e7\u00e3o)<\/li>\n<\/ul>\n<p>Falta algo: os limites da API, ou seja, <strong>as condi\u00e7\u00f5es para que ela funcione<\/strong>. \u00c9 muito dif\u00edcil tornar isto expl\u00edcito em uma API REST, mas com c\u00f3digo execut\u00e1vel, especialmente em linguagens que possuam um recurso como as exceptions do Java, n\u00e3o. Como seria uma terceira vers\u00e3o da nossa API?<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nclass PessoaNegocio {\r\nvoid cadastrar(Pessoa pessoa) throws Valida\u00e7\u00e3o\u00a0(...)\r\n}\r\n<\/pre>\n<p>N\u00e3o preciso mais retornar um valor inteiro: se a persist\u00eancia for bem sucedida, o pr\u00f3prio m\u00e9todo j\u00e1 vai preencher o atributo &#8220;id&#8221; do objeto que passei como par\u00e2metro. E se algo der errado? Uma exce\u00e7\u00e3o chamada\u00a0<em>Valida\u00e7\u00e3o<\/em> (evite caracteres especiais no seu c\u00f3digo) ser\u00e1 disparada, e\u00a0<strong>nesta<\/strong> se encontrar\u00e3o os detalhes a respeito do que deu errado.<\/p>\n<p>A exce\u00e7\u00e3o \u00e9 parte do contrato: ela nos diz algo como:<\/p>\n<blockquote><p>Ok, vou cadastrar esta pessoa no banco de dados, mas apenas se o objeto tiver valores v\u00e1lidos para todos os atributos.<\/p><\/blockquote>\n<p>Nossa API agora tem um limite bem definido: voc\u00ea l\u00ea a assinatura do m\u00e9todo e sabe que somente objetos v\u00e1lidos, ou seja, aqueles cujo estado interno esteja de acordo com o que se espera, ser\u00e1 persistido no banco de dados.<\/p>\n<p>O programador agora pode escrever c\u00f3digo ainda mais interessante:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\ntry {\r\n\/\/ o fluxo principal fica BEM isolado\r\nnegocio.cadastrar(pessoa);\r\n} catch (Valida\u00e7\u00e3o erroValidacao) {\r\n\/\/ eu sei que meu problema \u00e9 de valida\u00e7\u00e3o\r\n\/\/ talvez eu possa projetar algum comportamento\r\n\/\/ de retentativa, ou mesmo informar melhor o\r\n\/\/ usu\u00e1rio final a respeito da bobagem que est\u00e1\r\n\/\/ tentando fazer\r\n}\r\n<\/pre>\n<p>E aqui entra mais um ponto que voc\u00ea deve levar em considera\u00e7\u00e3o quando for escrever sua API: os erros que talvez\u00a0seus clientes n\u00e3o consigam aliviar. Uma falha no seu SGBD. Ser\u00e1 que seria legal tentar melhorar um pouco mais nossa API tal como no exemplo abaixo?<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nvoid cadastrar(Pessoa pessoa) throws Valida\u00e7\u00e3o, JDBCException\r\n<\/pre>\n<p>Antes eu sabia que objetos inv\u00e1lidos n\u00e3o seriam persistidos: agora tamb\u00e9m sei que uma falha no banco de dados pode ocorrer. Mais do que isto, sei que \u00e9 um banco de dados relacional (JDBCException). Aqui entra o seu contexto.<\/p>\n<p>Voc\u00ea quer que os usu\u00e1rios da sua API\u00a0<strong>saibam<\/strong> que por tr\u00e1s dos panos est\u00e1 um SGBD relacional? Se sim, ok. Se n\u00e3o, trate internamente estes problemas e dispare uma exce\u00e7\u00e3o do tipo\u00a0<em>RuntimeException<\/em> ou derivadas. Voc\u00ea estar\u00e1 aqui expondo detalhes de uma camada inferior sem necessidade alguma, e ainda tornando mais dif\u00edcil a vida dos usu\u00e1rios da sua API.<\/p>\n<p>Agora, se voc\u00ea quer expor este aspecto do sistema, perfeito: h\u00e1 aqui uma delega\u00e7\u00e3o de responsabilidade. O cliente da sua API ter\u00e1 de lidar explicitamente com erros provenientes da camada inferior do sistema.<\/p>\n<h2>Uma r\u00e1pida men\u00e7\u00e3o ao Groovy<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-235\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\" alt=\"groovylogo\" width=\"203\" height=\"100\" \/><\/p>\n<p>Groovy \u00e9 uma linguagem que visa desburocratizar o trabalho do desenvolvedor. Uma das formas que faz isto \u00e9 atrav\u00e9s do modo como lidamos com exce\u00e7\u00f5es do tipo checked.<\/p>\n<p>Enquanto no Java, c\u00f3digo que ir\u00e1 chamar um m\u00e9todo que dispara uma exce\u00e7\u00e3o obrigatoriamente deve envolver a chamada ao m\u00e9todo em um bloco catch ou incluir a declara\u00e7\u00e3o da exce\u00e7\u00e3o no m\u00e9todo que o chamar\u00e1, em Groovy este n\u00e3o \u00e9 o caso. Ent\u00e3o, c\u00f3digo Java similar ao exposto abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\ntry {\r\nnegocio.cadastrar(pessoa);\r\n} catch (Valida\u00e7\u00e3o ex) {\r\n\/\/ trato aqui\r\n}\r\n<\/pre>\n<p>ou<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nvoid executaAlgo() throws Valida\u00e7\u00e3o {\r\n(...)\r\nnegocio.cadastra(pessoa);\r\n(...)\r\n}\r\n<\/pre>\n<p>Em Groovy eu apenas chamo o m\u00e9todo e o incluo em um bloco try&#8230; catch ou adiciono\u00a0uma declara\u00e7\u00e3o do tipo throws \u00a0se eu quiser. Ok, ignoro ent\u00e3o as exceptions? N\u00e3o.<\/p>\n<p>Se voc\u00ea vai projetar\u00a0uma API, tudo o que disse em rela\u00e7\u00e3o ao Java tamb\u00e9m se aplica ao Groovy, pois exceptions nos ajudam a explicitar os limites da mesma.<\/p>\n<h2>Concluindo<\/h2>\n<p>Meu objetivo neste post foi ir al\u00e9m do uso padr\u00e3o das exceptions como uma ferramenta que nos possibilita escrever c\u00f3digo mais robusto. Como puderam ver, elas tamb\u00e9m nos ajudam a implementar\u00a0<strong>melhores<\/strong> APIs: com contrato melhor explicitado, mais f\u00e1ceis de usar e que, consequentemente, acabar\u00e3o por criar sistemas tamb\u00e9m mais robustos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Usando as exce\u00e7\u00f5es do Java para desenhar melhores APIs<\/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":[5,6],"tags":[],"class_list":["post-2218","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-groovy","category-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Projete boas APIs com Java exceptions - \/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=2218\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Projete boas APIs com Java exceptions - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Usando as exce\u00e7\u00f5es do Java para desenhar melhores APIs\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=2218\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2015-07-07T23:14:42+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=\"7 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=2218\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=2218\",\"name\":\"Projete boas APIs com Java exceptions - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2218#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2218#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/10\/java_logo_2.png\",\"datePublished\":\"2015-07-07T23:14:42+00:00\",\"dateModified\":\"2015-07-07T23:14:42+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2218#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=2218\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2218#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=2218#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Projete boas APIs com Java exceptions\"}]},{\"@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":"Projete boas APIs com Java exceptions - \/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=2218","og_locale":"pt_BR","og_type":"article","og_title":"Projete boas APIs com Java exceptions - \/dev\/Kico","og_description":"Usando as exce\u00e7\u00f5es do Java para desenhar melhores APIs","og_url":"https:\/\/devkico.itexto.com.br\/?p=2218","og_site_name":"\/dev\/Kico","article_published_time":"2015-07-07T23:14:42+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":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=2218","url":"https:\/\/devkico.itexto.com.br\/?p=2218","name":"Projete boas APIs com Java exceptions - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2218#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2218#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/10\/java_logo_2.png","datePublished":"2015-07-07T23:14:42+00:00","dateModified":"2015-07-07T23:14:42+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2218#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=2218"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=2218#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=2218#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Projete boas APIs com Java exceptions"}]},{"@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\/2218"}],"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=2218"}],"version-history":[{"count":7,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2218\/revisions"}],"predecessor-version":[{"id":2225,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2218\/revisions\/2225"}],"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=2218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}