{"id":78,"date":"2008-06-30T19:56:18","date_gmt":"2008-06-30T17:56:18","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=78"},"modified":"2008-06-30T19:56:18","modified_gmt":"2008-06-30T17:56:18","slug":"c-comment-capturer-une-exception","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2008\/06\/c-comment-capturer-une-exception\/","title":{"rendered":"C++ &#8211; Comment capturer une exception"},"content":{"rendered":"<p>Il y a trois fa\u00e7ons de capturer une exception: par valeur, par r\u00e9f\u00e9rence ou par pointeur.<\/p>\n<h3>Capture par valeur<\/h3>\n<p>Capturer une exception par valeur a deux inconv\u00e9nients principaux. D&rsquo;abord cela n\u00e9cessite une copie de l&rsquo;objet ce qui, si cet objet est de taille importante, n&rsquo;est pas tr\u00e8s efficient. Ensuite, copier un objet demande du temps et donc une capture par valeur sera forc\u00e9ment plus lente. De plus, si les ressources disponibles sont d\u00e9j\u00e0 faibles, cette copie pourrait elle-m\u00eame provoquer une exception. G\u00e9n\u00e9rer une exception quand une autre exception est active provoque l&rsquo;appel de la fonction terminate(). Ce qui n&rsquo;est pas \u00e0 conseiller.<\/p>\n<h3>Capture par r\u00e9f\u00e9rence<\/h3>\n<p>C&rsquo;est la m\u00e9thode \u00e0 pr\u00e9f\u00e9rer. C&rsquo;est une m\u00e9thode plus efficiente que par valeur et en plus, les r\u00e9f\u00e9rences conservent l&rsquo;aspect polymorphique des objets. Mais faut-il capturer par r\u00e9f\u00e9rence constante ou non. La r\u00e8gle habituelle s&rsquo;applique ici aussi. Si on pr\u00e9voit de ne rien changer \u00e0 l&rsquo;objet, autant indiquer qu&rsquo;il est constant. le compilateur donnera une erreur chaque fois qu&rsquo;on essaiera de modifier l&rsquo;objet et tout programmeur saura directement en voyant la r\u00e9f\u00e9rence constante que l&rsquo;objet ne sera pas modifi\u00e9. <\/p>\n<h3>Capture par pointeur<\/h3>\n<p>On pourrait tr\u00e8s bien capturer par pointeur mais le probl\u00e8me ici est qui est responsable de la lib\u00e9ration de la m\u00e9moire et surtout comment ?<br \/>\nConsid\u00e9rons le code suivant:<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">void<\/span> f1()\r\n{\r\n  <span class=\"reservedname\">int<\/span> a = 10;\r\n  <span class=\"reservedname\">throw<\/span> &amp;a;\r\n}\r\n\r\n<span class=\"reservedname\">void<\/span> f2()\r\n{\r\n  <span class=\"reservedname\">throw<\/span> <span class=\"reservedname\">new<\/span> <span class=\"reservedname\">int<\/span>(10);\r\n}\r\n\r\n<span class=\"reservedname\">void<\/span> f3()\r\n{\r\n  <span class=\"reservedname\">throw<\/span> <span class=\"reservedname\">new<\/span> <span class=\"reservedname\">int<\/span>[10];\r\n}\r\n\r\n<span class=\"reservedname\">int<\/span> main()\r\n{\r\n  <span class=\"reservedname\">try<\/span>\r\n  {\r\n    f1();\r\n    <span class=\"codecomment\">\/\/ ou\r\n<\/span>    f2();\r\n    <span class=\"codecomment\">\/\/ ou\r\n<\/span>    f3();\r\n  }\r\n  <span class=\"reservedname\">catch<\/span>( <span class=\"reservedname\">int<\/span> * p )\r\n  {\r\n    <span class=\"codecomment\">\/\/comment lib\u00e9rer la m\u00e9moire?\r\n<\/span>  }\r\n} \r\n<\/pre>\n<p>Le probl\u00e8me ici est clairement que dans le <em>catch()<\/em>, on ne sait pas s&rsquo;il faut lib\u00e9rer la m\u00e9moire avec <em>delete<\/em>, <em>delete[]<\/em> ou ne pas la lib\u00e9rer du tout. c&rsquo;est impossible \u00e0 savoir. Autrement dit, on ne capture pas d&rsquo;exception par pointeur. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il y a trois fa\u00e7ons de capturer une exception: par valeur, par r\u00e9f\u00e9rence ou par pointeur. Capture par valeur Capturer une exception par valeur a deux inconv\u00e9nients principaux. D&rsquo;abord cela n\u00e9cessite une copie de l&rsquo;objet ce qui, si cet objet est de taille importante, n&rsquo;est pas tr\u00e8s efficient. Ensuite, copier un objet demande du temps [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/78"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=78"}],"version-history":[{"count":0,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/78\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=78"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=78"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=78"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}