2012-05-17 35 views
5

tuyên truyền ngoại lệ là gì?tuyên truyền ngoại lệ là gì?

Tôi đã thử trong google nhưng không hài lòng với kết quả. Cũng xin giải thích với một số ví dụ nếu có thể. C++, php và ngôn ngữ java thích hợp hơn.

+0

truy vấn: bạn đã đọc về nó ở đâu - ngữ cảnh là gì? – home

+0

Có gì sai với câu hỏi này. tại sao lại bỏ phiếu? –

+0

-1: @Dear: Một phương tiện downvote (như chú giải công cụ nói), "không hiển thị bất kỳ nỗ lực nghiên cứu nào." Và xem xét câu trả lời từ nes1983, điều đó dường như được bảo đảm. –

Trả lời

10

Được giải thích, đáng ngạc nhiên, trong số Java tutorial page about exceptions.

Một ngoại lệ lan truyền từ phương pháp này sang phương thức khác, tăng ngăn xếp cuộc gọi cho đến khi nó bị bắt. Vì vậy, nếu a() gọi b(), gọi c(), gọi d() và nếu d() ném ngoại lệ, ngoại lệ sẽ lan truyền từ d đến c thành b, trừ khi một trong các phương pháp này bắt ngoại lệ.

0

Giả sử bạn có một đối tượng gọi một đối tượng khác và sau đó gọi một đối tượng khác. Nếu một ngoại lệ được ném vào bất kỳ đối tượng được gọi nào và nó không bị bắt, thì ngoại lệ sẽ lan truyền đến phương thức gọi (và treo ứng dụng nếu không bị bắt ở bất kỳ đâu).

class MyClass{ 

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

} 

class A{ 

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

} 

Nếu phương pháp myMethod được thực hiện một ngoại lệ sẽ được ném vào doSomething phương pháp của đối tượng A, và ngoại trừ truyền cho phương thức cách gọi trong ngăn xếp (vì vậy ngoại lệ truyền trong ví dụ này để myMethod của myClass).

+0

Phải. Tôi đã sửa câu trả lời. Cảm ơn! – Averroes

0

Khi xây dựng một chương trình, nơi xảy ra lỗi không phải là nơi tốt nhất để xử lý nó, tức là lỗi được xử lý tại địa điểm thay vì nơi xảy ra lỗi.

10

Câu trả lời ngắn: Trường hợp ngoại lệ không được truyền sẽ được truyền trong ngăn xếp cuộc gọi cho đến khi ngăn xếp trống, tuyên truyền này được gọi là Tuyên truyền ngoại lệ.

Câu trả lời dài: Sau khi phương thức đưa ra một ngoại lệ, hệ thống thời gian chạy tìm kiếm ngăn chứa cuộc gọi có thể xử lý ngoại lệ. Việc tìm kiếm bắt đầu với phương thức mà lỗi xảy ra và tiến hành thông qua ngăn xếp cuộc gọi theo thứ tự ngược lại, trong đó các phương thức được gọi. Khi tìm thấy một trình xử lý thích hợp, hệ thống thời gian chạy chuyển ngoại lệ cho trình xử lý. Ngoài ra, có một điểm đáng lưu ý:

Cho phép nói, chúng tôi có một chuỗi các phương thức trong đó method3() gọi phương thức 2() và method2() gọi phương thức1(). Vì vậy, khi

1) Ngoại lệ xảy ra trong phương thức3() và trong phương thức3(), chúng tôi không có bất kỳ trình xử lý ngoại lệ nào.

2) Ngoại lệ không bắt buộc sẽ được truyền xuống trong ngăn xếp tức là nó sẽ kiểm tra xử lý ngoại lệ thích hợp trong phương thức2().

3) Một lần nữa trong phương thức 2 nếu chúng ta không có bất kỳ trình xử lý ngoại lệ nào thì ngoại lệ một lần nữa được truyền xuống phương thức1(), nơi nó tìm trình xử lý ngoại lệ.

enter image description here

Ví dụ:

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

Output:

ngoại lệ được xử lý ở đây

Tiếp tục với Bình thường dòng chảy ...

Chỉ các ngoại lệ không được kiểm soát mới được truyền đi. kiểm tra ngoại lệ ném biên soạn lỗi

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

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

2

Bất cứ khi nào phương pháp này được gọi là ngăn xếp được hình thành và một ngoại lệ là lần đầu tiên ném từ phía trên cùng của ngăn xếp và nếu nó không bị bắt, nó bắt đầu đi xuống ngăn xếp đến các phương thức trước đó cho đến khi nó không bị bắt. Nếu trường hợp ngoại lệ vẫn chưa được thực hiện ngay cả sau khi đến cuối ngăn xếp, nó được truyền tới JVM và chương trình bị chấm dứt.

ngoại lệ không được kiểm soát được tự động truyền trong java. Chương trình>

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

} 

Để tuyên truyền phương pháp ngoại lệ đã chọn phải ném ngoại lệ bằng cách sử dụng từ khóa ném. Chương trình>

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

} 

Tuyên truyền ngoại lệ được kiểm soát (NullPointerException)> Propagating unchecked exception (NullPointerException)

Tuyên truyền kiểm tra ngoại lệ (FileNotFoundException) sử dụng ném từ khóa> Propagating checked exception (FileNotFoundException) using throws keyword

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

1

khi một ngoại lệ xảy ra , tuyên truyền là một quá trình trong đó ngoại lệ là sinh tố d từ trên xuống dưới cùng của ngăn xếp và vào chuỗi gọi bị cắt và nếu không bị kẹt ở đó, ngoại lệ lại rơi xuống phương pháp trước đó, và cứ thế cho đến khi nó bị bắt hoặc cho đến khi nó chạm đáy của cuộc gọi stack.Điều này được gọi là tuyên truyền ngoại lệ.

Ví dụ giả định ngăn xếp của chúng tôi là:

c()

b()

một()

main()

Nếu một ngoại lệ xảy ra trong c () và nếu nó không được xử lý nó sẽ được nhân giống với phương thức b() trước đó và nếu nó không được xử lý ở đó, một lần nữa nó được truyền tới một phương thức(), nơi ngoại lệ được xử lý và vân vân.

Ngoại lệ có thể được xử lý trong bất kỳ phương thức nào trong ngăn xếp cuộc gọi theo phương thức main(), phương thức a(), b() hoặc phương thức c().

Trả lời chủ đề

Các vấn đề liên quan