2012-05-17 2 views
5

무엇이 예외 전파?예외 전파 란 무엇입니까?

Google에서 시도했지만 결과에 만족하지 않습니다. 가능한 경우 몇 가지 예를 들어 설명하십시오. C++, PHP 및 Java 언어가 바람직합니다.

+0

반의문 : 어디서 읽었습니까? 문맥은 무엇입니까? – home

+0

이 질문에 잘못된 것이 있습니다. 왜 투표가 내려 졌습니까? –

+0

-1 : @Dear : downvote는 (툴팁에서 말하는 것처럼) "연구 노력을 보이지 않습니다." 그리고 nes1983의 답을 생각해 보면, 그것은 정당한 것처럼 보였다. –

답변

10

놀랍게도, Java tutorial page about exceptions에 설명되어 있습니다.

예외가 catch에서 호출 될 때까지 메서드에서 메서드로 전파됩니다. 그러므로 a()b()이라면 c()을 호출하고 d()을 호출하고 d()이 예외를 throw하면 이러한 메소드 중 하나가 예외를 포착하지 않는 한 예외는 d에서 c에서 b로 a로 전파됩니다.

0

다른 개체를 호출 한 다음 다른 개체를 호출하는 개체가 있다고 가정 해 보겠습니다. 예외가 호출 된 객체 중 하나에서 throw되고 catch되지 않으면 예외가 호출하는 메소드에 전파되고 아무데도 잡히지 않으면 응용 프로그램이 충돌합니다. myMethod 메소드가 예외 객체 AdoSomething 방법에서 발생한다 실행되고, 예외는 스택의 호출 방법에 전파된다

class MyClass{ 

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

} 

class A{ 

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

} 

경우 (따라서 예외 myClassmyMethod이 예에서 전파).

+0

오른쪽. 나는 답을 바로 잡았다. 감사! – Averroes

0

프로그램을 구성하는 과정에서 오류가 발생하는 장소가 처리하기 가장 좋은 장소가 아닙니다. 오류는 발생 된 장소가 아닌 장소에서 처리됩니다.

10

짧은 대답 : 캐치되지 않는 예외는 스택이 비게 될 때까지 호출 스택에서 전파됩니다.이 전파를 예외 전파라고합니다.

긴 않음 : 메소드가 예외를 발생 후 런타임 시스템 예외를 처리 할 수있는 코드 (예외 핸들러)의 블록을 포함하는 방법을위한 호출 스택을 검색한다. 검색은 오류가 발생한 메서드에서 시작하여 메서드가 호출 된 역순으로 호출 스택을 통해 진행됩니다. 적절한 핸들러가 발견되면 런타임 시스템은 핸들러에 예외를 전달합니다. 또한 메모의 가치가있는 점이 있습니다.

우리는 method3()이 method2()를 호출하고 method2()가 method1()을 호출하는 일련의 메소드가 있습니다. 그래서 언제

1) 예외는 method3()에서 발생하고 method3()에서는 예외 처리기가 없습니다.

2) 캐치되지 않는 예외는 스택에서 아래로 전파됩니다. 즉, method2()에서 적절한 예외 처리기를 검사합니다.

3) 다시 예외 2 처리기가없는 경우 예외가 처리기를 찾은 곳에서 다시 method1()로 전파됩니다.

enter image description here

예 :

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..."); 
    } 
} 

출력 :

예외가 여기

정상 흐름을 계속

을 처리 ...

확인되지 않은 예외 만 전파됩니다. 체크 예외 던져 컴파일 오류

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

[2] 방법이 스택이라고마다 http://www.c4learn.com/java/java-exception-propagation/

2

가 형성되고, 예외가 제 스택의 상부에서 그리고 만약 슬로우 잡히지 않을 때까지 이전 방법으로 스택을 내려 가기 시작합니다. 스택의 맨 아래에 도달 한 후에도 예외가 포착되지 않으면 JVM으로 전파되고 프로그램이 종료됩니다.

Java에서 확인되지 않은 예외가 자동으로 전파됩니다. 프로그램> 키워드를 던졌습니다 사용하여 예외를 슬로우 할 필요가 체크 된 예외 방법을 전파를 들어

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(); 
} 

} 

. 프로그램>

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(); 
} 

} 

체크되지 않는 예외를 전파 (NullPointerException가)> Propagating unchecked exception (NullPointerException)

를 전파하는 예외 (FileNotFoundException이) 사용을 던졌습니다 확인 키워드> Propagating checked exception (FileNotFoundException) using throws keyword

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

1

예외가 발생했을 때 , 전파는 예외가 droppe되는 프로세스입니다. d는 스택의 맨 위에서 맨 아래로 그리고 커팅 할 호출 체인으로 이동합니다. 거기서 잡히지 않으면 예외는 다시 이전 메소드로 내려갑니다. 잡을 때까지 또는 맨 아래까지 도달 할 때까지 계속됩니다 이것은 예외 전파라고합니다. 우리의 스택을지지 예컨대

이다 :

C()

B()

A()

주()

예외 C에서 발생하는 경우 () 메서드를 호출하고 처리되지 않으면 이전 b() 메서드로 전파되고 거기에서 처리되지 않으면 다시 예외가 처리되는 등의() 메서드로 전파됩니다.

예외는 main() 메서드, a() 메서드, b() 메서드 또는 c() 메서드에서 호출 스택의 모든 메서드에서 처리 할 수 ​​있습니다.

댓글 달기