{"id":2447,"date":"2018-02-27T18:54:15","date_gmt":"2018-02-27T23:54:15","guid":{"rendered":"https:\/\/www.manualjava.net\/?p=2447"},"modified":"2018-03-06T14:23:40","modified_gmt":"2018-03-06T19:23:40","slug":"mecanismo-del-manejo-de-excepciones","status":"publish","type":"post","link":"https:\/\/www.manualjava.net\/?p=2447","title":{"rendered":"Mecanismo del manejo de excepciones"},"content":{"rendered":"<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-2449\" src=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/java39-300x73.jpg\" alt=\"\" width=\"296\" height=\"72\" srcset=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/java39-300x73.jpg 300w, https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/java39.jpg 445w\" sizes=\"(max-width: 296px) 100vw, 296px\" \/><\/p>\n<p><span style=\"color: #000000;\">El modelo de un mecanismo de excepciones consta, fundamentalmente, de cinco nuevas palabras reservadas\u00a0<strong>try, throw, throws, catch y finally.\u00a0<\/strong><\/span><!--more--><\/p>\n<ul>\n<li><span style=\"color: #000000;\">try, un bloque para detectar excepciones.<\/span><\/li>\n<li><span style=\"color: #000000;\">catch, un manejador para capturar excepciones de los bloques try.<\/span><\/li>\n<li><span style=\"color: #000000;\">throw, una expresi\u00f3n para levantar (raise) excepciones.<\/span><\/li>\n<li><span style=\"color: #000000;\">throws, indica las excepciones que puede elevar un m\u00e9todo.<\/span><\/li>\n<li><span style=\"color: #000000;\">finally, bloque opcional, situado despu\u00e9s de los catch de un try.<\/span><\/li>\n<\/ul>\n<p><span style=\"color: #000000;\">Los pasos del modelo son:<\/span><\/p>\n<ol>\n<li><span style=\"color: #000000;\">Primero, el programador establece un conjunto de operaciones para anticipar errores. Esto se realiza en un bloque try.<\/span><\/li>\n<li><span style=\"color: #000000;\">Cuando una rutina encuentra un error, se \u00ablanza\u00bb (throw) una excepci\u00f3n. El lanzamiento (throwing) de una excepci\u00f3n es el acto de levantar una excepci\u00f3n.<\/span><\/li>\n<li><span style=\"color: #000000;\">Por \u00faltimo, alguien interesado en una condici\u00f3n de error (para limpieza y\/o recuperaci\u00f3n) anticipar\u00e1 el error y \u00abcapturar\u00e1\u00bb (catch) la excepci\u00f3n que se ha lanzado.<\/span><\/li>\n<\/ol>\n<p><span style=\"color: #000000;\">El mecanismo de excepciones se completa con:<\/span><\/p>\n<ol>\n<li><span style=\"color: #000000;\">Un bloque finally que, si se especifica, siempre se ejecuta al final de un try.<\/span><\/li>\n<li><span style=\"color: #000000;\">Especificaciones de excepciones que dictamina cu\u00e1les excepciones, si existen, puede lanzar un m\u00e9todo.<\/span><\/li>\n<\/ol>\n<h2><strong><span style=\"color: #000000;\">El modelo de manejo de excepciones<\/span><\/strong><\/h2>\n<p><span style=\"color: #000000;\">La filosof\u00eda que subyace en el modelo de manejo de excepciones es simple. El c\u00f3digo que trata con un problema no es el mismo c\u00f3digo que lo detecta. Cuando una excepci\u00f3n se encuentra en un programa, la parte del programa que detecta la excepci\u00f3n puede comunicar que la expresi\u00f3n ha ocurrido levantando, o lanzando (throwing), una excepci\u00f3n.<\/span><\/p>\n<p><span style=\"color: #000000;\">De hecho, cuando el c\u00f3digo de usuario llama a un m\u00e9todo incorrectamente o utiliza un objeto de una clase de manera inadecuada, la biblioteca de la clase crea un objeto excepci\u00f3n que contiene informaci\u00f3n sobre lo que era incorrecto. La biblioteca levanta (raise) una excepci\u00f3n, una acci\u00f3n que hace el objeto excepci\u00f3n disponible al c\u00f3digo de usuario a trav\u00e9s de un manejador de excepciones. El c\u00f3digo de usuario que maneja la excepci\u00f3n puede decidir qu\u00e9 hacer con el objeto excepci\u00f3n. El cortafuegos que act\u00faa de puente entre una biblioteca de clases y una aplicaci\u00f3n debe hacer varias cosas para gestionar debidamente el flujo de excepciones, reservando y liberando memoria de modo din\u00e1mico.\u00a0<span style=\"color: #000080;\"><a style=\"color: #000080;\" href=\"https:\/\/www.manualjava.net\/?p=2397\">(Ver Manejo de excepciones en Java)<\/a><\/span><\/span><\/p>\n<p><span style=\"color: #000000;\">Manejo de excepciones construye un \u00abcortafuego\u00bb.<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-2463 aligncenter\" src=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/Excepci\u00f3n-300x187.png\" alt=\"\" width=\"375\" height=\"234\" srcset=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/Excepci\u00f3n-300x187.png 300w, https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/Excepci\u00f3n.png 575w\" sizes=\"(max-width: 375px) 100vw, 375px\" \/><\/p>\n<p><span style=\"color: #000000;\">Una de las razones m\u00e1s significativas para utilizar excepciones es que las aplicaciones no pueden ignorarlas. Cuando el mecanismo de excepciones levanta una excepci\u00f3n, alguien debe tratarla. En caso contrario, la excepci\u00f3n es \u00abno capturada\u00bb (uncaught) y el programa termina por omisi\u00f3n. Este poderoso concepto es el coraz\u00f3n del manejo de excepciones y fuerza a las aplicaciones a manejar excepciones en lugar de ignorarlas.<\/span><\/p>\n<p><span style=\"color: #000000;\">El mecanismo de excepciones de Java sigue un\u00a0<strong>modelo de terminaci\u00f3n.\u00a0<\/strong>Esto implica que nunca vuelve al punto en que se levanta una excepci\u00f3n. Las excepciones no son como manejadores de interrupciones que bifurcan a una rutina de servicio antes de volver al spot de interrupci\u00f3n. Esta t\u00e9cnica (llamada resumption) tiene un alto tiempo suplementario, es propensa a bucles infinitos y es m\u00e1s complicado de implementar que el modelo de terminaci\u00f3n. Dise\u00f1ado para manejar solo excepciones s\u00edncronas con un solo hilo de control, el mecanismo de excepciones implementa un camino alternativo de una sola v\u00eda en diferentes sitios de su programa.<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Ejemplo<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">Se escribe un fragmento de c\u00f3digo Java en el que en el m\u00e9todo main() se define un bloque try, en el que es invocado el m\u00e9todo f() que lanza una excepci\u00f3n.<\/span><\/p>\n<p><span style=\"color: #000000;\"><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 <\/span>\u00a0void escucha() throws Exception<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo que produce una excepci\u00f3n que se lanza<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ . . .<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 throw new FException();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ . . .<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0static public void main(String[] args){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0try{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0escucha();\u00a0 \u00a0 \u00a0\/\/ m\u00e9todo que puede lanzar cualquier excepci\u00f3n<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ c\u00f3digo normal aqu\u00ed<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0catch(FException t){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ captura una excepci\u00f3n de tipo FException<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ hacer algo<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0catch(Exception e){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ captura cualquier excepci\u00f3n<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ hacer algo<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ resto de c\u00f3digo<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><\/p>\n<p><span style=\"color: #000000;\">escucha() es un simple procedimiento en el que se ha declarado que puede lanzar cualquier excepci\u00f3n. Esto se hace en la cabecera del m\u00e9todo, con:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0throws Exception<\/span><\/p>\n<p><span style=\"color: #000000;\">Exception es clase base de las excepciones que son tratadas. Debido a la conversi\u00f3n autom\u00e1tica entre clase derivada y clase base, se afirma que puede lanzar cualquier excepci\u00f3n. Cuando el m\u00e9todo encuentra una condici\u00f3n de error lanza una excepci\u00f3n. Esto se hace con la sentencia:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0throw new FException();<\/span><\/p>\n<p><span style=\"color: #000000;\">El operando de la expresi\u00f3n\u00a0<strong>throw\u00a0<\/strong>es un objeto. Normalmente los objetos almacenan informaci\u00f3n sobre el error ocurrido. Java proporciona una jerarqu\u00eda de clases para el manejo de excepciones; el programador puede declarar clases para el tratamiento de errores en la aplicaci\u00f3n. En el m\u00e9todo main(), la llamada a escucha() se encierra en un bloque try. Este es un bloque de c\u00f3digo encerrado dentro de una sentencia try:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0try{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ . . .<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><\/p>\n<p><span style=\"color: #000000;\">Un bloque catch() captura una excepci\u00f3n del tipo indicado. En el ejemplo anterior se han especificado dos:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0catch(FException t)<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0catch(Exception e)<\/span><\/p>\n<p><span style=\"color: #000000;\">Una expresi\u00f3n\u00a0<strong>catch\u00a0<\/strong>es comparable a un procedimiento con un \u00fanico argumento.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El modelo de un mecanismo de excepciones consta, fundamentalmente, de cinco nuevas palabras reservadas\u00a0try, throw, throws, catch y finally.\u00a0<\/p><p><a class=\"more-link btn\" href=\"https:\/\/www.manualjava.net\/?p=2447\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":2449,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[],"_links":{"self":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2447"}],"collection":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2447"}],"version-history":[{"count":21,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2447\/revisions"}],"predecessor-version":[{"id":2718,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2447\/revisions\/2718"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/media\/2449"}],"wp:attachment":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}