2012-05-17 25 views
5

¿qué es excepción propagación?¿qué es la propagación de excepciones?

Lo intenté en google pero no estoy satisfecho con el resultado. Por favor también explique con algún ejemplo si es posible. C++, php y Java son preferibles.

+0

counterquestion: dónde lo leíste - ¿cuál es el contexto? – home

+0

¿Qué pasa con esta pregunta? ¿por qué abajo votado? –

+0

-1: @Tear: Un voto negativo significa (como dice la información sobre herramientas) que "no muestra ningún esfuerzo de investigación". Y teniendo en cuenta la respuesta de nes1983, eso parecía justificado. –

Respuesta

10

Se explica, sorprendentemente, en el Java tutorial page about exceptions.

Una excepción se propaga de un método a otro, sube la pila de llamadas hasta que se detecta. Entonces, si a() llama al b(), que llama al c(), que llama al d(), y si d() lanza una excepción, la excepción se propagará de d hasta c a b, a menos que uno de estos métodos capture la excepción.

0

Digamos que tiene un objeto que llama a otro objeto y luego uno llama a otro. Si se lanza una excepción en cualquiera de los objetos llamados y no se detecta, la excepción se propaga al método de llamada (y bloquea la aplicación si no se detecta en ningún lugar).

class MyClass{ 

void myMethod(){ 
    A a = new A(); 
    a.doSomething(0); 
} 

} 

class A{ 

    double doSomething(int n){ 
    return 1/n; 
    } 

} 

Si se ejecuta myMethod método una excepción será lanzada en doSomething método de objeto A, y la excepción se propaga al método de invocación de la pila (por lo que la excepción se propaga en este ejemplo para myMethod de myClass).

+0

Derecha. He corregido la respuesta. ¡Gracias! – Averroes

0

Al construir un programa, el lugar en el que ocurre un error no es el mejor lugar para manejarlo, es decir, el error se maneja en el lugar y no en el lugar donde se ha producido.

10

Respuesta corta: Las excepciones no detectadas se propagan en la pila de llamadas hasta que la pila se vacíe, esta propagación se denomina Propagación de excepciones.

Respuesta larga: Después de un método lanza una excepción, el sistema de ejecución busca en la pila de llamadas para un método que contiene un bloque de código (gestor de excepciones) que puede manejar la excepción. La búsqueda comienza con el método en el que se produjo el error y continúa a través de la pila de llamadas en el orden inverso al que se llamaron los métodos. Cuando se encuentra un controlador apropiado, el sistema de tiempo de ejecución pasa la excepción al controlador. Además, hay un punto digno de mención:

Digamos que tenemos una cadena de métodos donde method3() llama a method2() y method2() llama a method1(). Entonces cuando

1) Se produce una excepción en el método3() y en el método3() no tenemos ningún manejador de excepciones.

2) La excepción no detectada se propagará hacia abajo en la pila, es decir, se controlará el controlador de excepción apropiado en el método2().

3) De nuevo en el método2 si no tenemos ningún controlador de excepción, nuevamente la excepción se propaga hacia abajo al método1() donde encuentra el manejador de excepciones.

enter image description here

Ejemplo:

class ExceptionPropagation{ 

    void method3(){ 
    int result = 100/0; //Exception Generated 
    } 

    void method2(){ 
    method3(); 
    } 

    void method1(){ 
    try{ 
    method2(); 
    } catch(Exception e){ 
    System.out.println("Exception is handled here"); 
    } 
    } 

    public static void main(String args[]){ 
    ExceptionPropagation obj=new ExceptionPropagation(); 
    obj.method1(); 
    System.out.println("Continue with Normal Flow..."); 
    } 
} 

Salida:

excepción se maneja aquí

Continuar con el flujo normal ...

Solo se propagan las excepciones no verificadas. Las excepciones comprobadas tiran compilación error

[1] http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html

[2] http://www.c4learn.com/java/java-exception-propagation/

2

Siempre que los métodos se llaman pila se forma y se produce una excepción primero desde la parte superior de la pila y si no se atrapa, comienza a bajar la pila a los métodos anteriores hasta que no se atrapa. Si la excepción permanece no detectada incluso después de llegar al final de la pila, se propaga a JVM y el programa finaliza.

excepciones no verificadas se propagan automáticamente en java. programa>

public class ExceptionTest { 
public static void main(String[] args) { 
    method1(); 
    System.out.println("after calling m()"); 
} 

static void method1() { 
    method2(); 
} 

static void method2() { 
    method3(); 
} 

static void method3() { 
    throw new NullPointerException(); 
} 

} 

método para propagar excepciones facturado debe lanzar una excepción mediante el uso de los tiros de palabras clave. programa>

public class ExceptionTest { 
public static void main(String[] args) 
       throws FileNotFoundException { 
     method1(); 
     System.out.println("after calling m()"); 
} 

static void method1() throws FileNotFoundException{ 
     method2(); 
} 

static void method2() throws FileNotFoundException{ 
     method3(); 
} 

static void method3() throws FileNotFoundException{ 
     throw new FileNotFoundException(); 
} 

} 

Propagar excepción no comprobada (NullPointerException)> Propagating unchecked exception (NullPointerException)

plantones excepción revisada (FileNotFoundException) usando los tiros de palabras clave> Propagating checked exception (FileNotFoundException) using throws keyword

Desde: http://www.javamadesoeasy.com/2015/05/exception-propagation-in-java-deep.html

1

cuando una excepción ocurre , la propagación es un proceso en el que la excepción es droppe d desde la parte superior hasta la parte inferior de la pila y en la cadena de llamadas para cortar y si no se captura allí, la excepción vuelve al método anterior, y así sucesivamente hasta que se atrapa o hasta que llega al fondo de la pila de llamadas. Esto se llama propagación de excepciones.

Para el Ejemplo asumir nuestra pila es:

c()

B()

un()

main()

Si una excepción ocurre en c () método y si no se maneja, se propagará al método b() anterior y si no se maneja allí, nuevamente se propaga a un método() donde se maneja la excepción, y así sucesivamente.

La excepción se puede manejar en cualquier método en la pila de llamadas ya sea en método main(), método a(), método b() o método c().

Respuesta al tema

Cuestiones relacionadas