{"id":534,"date":"2015-09-21T20:46:39","date_gmt":"2015-09-21T23:46:39","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/programacao\/?p=534"},"modified":"2021-06-18T15:40:17","modified_gmt":"2021-06-18T18:40:17","slug":"tratamento-excecoes-try-catch","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/programacao\/tratamento-excecoes-try-catch\/","title":{"rendered":"Tratamento de exce\u00e7\u00f5es no C++ usando try e catch"},"content":{"rendered":"\n<p>Programas sempre est\u00e3o sujeitos a erros. Alguns erros potenciais n\u00f3s conseguimos identificar e evitar em nosso algoritmo, mas o ideal seria tratar esses erros para caso os esque\u00e7amos em um momento posterior. Nesse sentido o C++ oferece o recurso de tratamento de exce\u00e7\u00f5es composto por essas tr\u00eas instru\u00e7\u00f5es: <em>try<\/em>, <em>catch<\/em> e <em>throw.<\/em><\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Para ilustrar o uso desse recurso, vamos considerar uma situa\u00e7\u00e3o comum de erros que \u00e9 a divis\u00e3o por zero. O algoritmo a seguir ilustra a opera\u00e7\u00e3o de divis\u00e3o sujeita a diviz\u00e3o por zero.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c++ decode:true\"><code lang=\"cpp\" class=\"language-cpp\">#include &lt;iostream&gt;\n\nusing namespace std;\n\nfloat divide(float x, float y) {\n    return x \/ y;\n}\n\nint main() {\n    int a, b;\n    cout &lt;&lt; \"Digite os valores: \";\n    cin &gt;&gt; a &gt;&gt; b;\n\n    cout &lt;&lt; divide(a, b);\n\n    return 0;\n}\n<\/code><\/pre>\n\n\n\n<p>Na fun\u00e7\u00e3o divide() existe a possibilidade do segundo argumento ser zero e gerar um erro na divis\u00e3o. Ent\u00e3o adicicionamos o tratamento de exce\u00e7\u00e3o a essa opera\u00e7\u00e3o.&nbsp; Veja se no bloco <em>try<\/em> foi adicionado um teste com o segundo valor (o valor do denominador) e verificando se ele \u00e9 igual a zero. Se ele for igual a zero \u00e9 lan\u00e7ado, utilizando o comando <em>throw,<\/em> o erro com o valor &#8220;1&#8221; (conforme a linha 4 do c\u00f3digo abaixo). Esse erro lan\u00e7ado ser\u00e1 capturado pelo bloco do <em>catch<\/em>, sendo o erro lan\u00e7ado recebido no argumento (no caso do exemplo ele est\u00e1 sendo chamado de erro e \u00e9 um valor inteiro).<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c++ decode:true\"><code lang=\"cpp\" class=\"language-cpp\">float divide(float x, float y) {\n    try {\n        if(y == 0) {\n            throw 1;\n        } else {\n            return a\/b;\n        }\n    } catch(int erro) {\n        if (erro == 1) {\n            cout &lt;&lt; \"Erro de divisao por zero\" &lt;&lt; endl;\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>No bloco <em>catch<\/em> foi testado o valor do erro para mostrar a mensagem apropriada sobre o erro. Nesse caso somente um erro foi identificado, ent\u00e3o o teste n\u00e3o precisaria ser feito, deixei apenas para ilustrar a possibilidade. Se v\u00e1rias exce\u00e7\u00f5es fossem poss\u00edveis, ent\u00e3o seria interessante lan\u00e7\u00e1-las com c\u00f3digos diferentes para mostrar mensagens apropriadas.<\/p>\n\n\n\n<p>Um problema com a fun\u00e7\u00e3o definida \u00e9 que ela retorna um valor definido apenas caso seja poss\u00edvel fazer a divis\u00e3o, caso contr\u00e1rio ela retornar\u00e1 qualquer valor. Ap\u00f3s o <em>try catch<\/em> \u00e9 poss\u00edvel continuar o c\u00f3digo sem problemas. No caso do c\u00f3digo abaixo foi pedido para retornar zero.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c++ mark:13 decode:true\"><code lang=\"cpp\" class=\"language-cpp\">float divide(float x, float y) {\n    try {\n        if(y == 0) {\n            throw 1;\n        } else {\n            return x\/y;\n        }\n    } catch(int erro) {\n        if (erro == 1) {\n            cout &lt;&lt; \"Erro de divisao por zero\" &lt;&lt; endl;\n        }\n    }\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Veja que zero n\u00e3o \u00e9 realmente uma boa op\u00e7\u00e3o de retorno pois zero pode ser um resultado poss\u00edvel de uma divis\u00e3o (por exemplo zero dividido por 5). Um tratamento melhor nesse caso \u00e9 mostrado no c\u00f3digo a seguir. No c\u00f3digo, a fun\u00e7\u00e3o divide() utiliza o throw para lan\u00e7ar o erro para fora da fun\u00e7\u00e3o e esse pode ser capturado na fun\u00e7\u00e3o principal e tratado como foi tratado no c\u00f3digo anterior.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c++ decode:true\"><code lang=\"cpp\" class=\"language-cpp\">#include &lt;iostream&gt;\n\nusing namespace std;\n\nfloat divide(float x, float y) {\n    if (y == 0) {\n        throw 1;\n    } else {\n        return x\/y;\n    }\n}\n\nint main() {\n    int a, b;\n    cout &lt;&lt; \"Digite os valores: \";\n    cin &gt;&gt; a &gt;&gt; b;\n\n    try {\n        cout &lt;&lt; divide(a, b);\n    } catch(int erro) {\n        if (erro == 1) {\n            cout &lt;&lt; \"Erro de divisao por zero\" &lt;&lt; endl;\n        }\n    }\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Complementando ainda mais o c\u00f3digo, supondo que voc\u00ea queria que o usu\u00e1rio informe um valor v\u00e1lido para fazer a opera\u00e7\u00e3o e, enquanto ele n\u00e3o fornecer um valor valor, continuar solicitando um valor v\u00e1lido. O c\u00f3digo abaixo envolve o bloco <em>try catch<\/em> em um la\u00e7o de repeti\u00e7\u00e3o controlado por uma vari\u00e1vel chamada&nbsp;error.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c++ mark:3,7,10,16,18 decode:true\"><code lang=\"cpp\" class=\"language-cpp\">int main() {\n    int a, b;\n    bool error = false;\n    cout &lt;&lt; \"Digite os valores: \";\n    cin &gt;&gt; a &gt;&gt; b;\n\n    do {\n        try {\n            cout &lt;&lt; divide(a, b);\n            error = false;\n        } catch(int erro) {\n            if (erro == 1) {\n                cout &lt;&lt; \"Erro por divisao por zero. Digite outro valor: \";\n                cin &gt;&gt; b;\n            }\n            error = true;\n        }\n    } while (error);\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Espero que o tutorial tenha sido \u00fatil. D\u00favidas, deixe nos coment\u00e1rios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Programas sempre est\u00e3o sujeitos a erros. Alguns erros potenciais n\u00f3s conseguimos identificar e evitar em nosso algoritmo, mas o ideal seria tratar esses erros para caso os esque\u00e7amos em um momento posterior. Nesse sentido o C++ oferece o recurso de tratamento de exce\u00e7\u00f5es composto por essas tr\u00eas instru\u00e7\u00f5es: try, catch e throw.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-534","post","type-post","status-publish","format-standard","hentry","category-c"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/534","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/comments?post=534"}],"version-history":[{"count":4,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/534\/revisions"}],"predecessor-version":[{"id":1079,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/534\/revisions\/1079"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/media?parent=534"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/categories?post=534"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/tags?post=534"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}