2010-05-26 45 views
14

Có cách nào để ném nhiều ngoại lệ trong java không?Ném nhiều ngoại lệ trong Java

+2

Không rõ nếu OP yêu cầu "ném một trong nhiều" ngoại lệ hoặc "ném nhiều ngoại lệ cùng một lúc" –

Trả lời

14

Không, đó là không có cách nào bạn có thể làm một cái gì đó như:

try { 
    throw new IllegalArgumentException(), new NullPointerException(); 
} catch (IllegalArgumentException iae) { 
    // ... 
} catch (NullPointerException npe) { 
    // ... 
} 

nếu đó là những gì bạn đang xin.

Bạn thể tuy nhiên sử dụng cause-constructor phải làm như sau:

try { 
    throw new IllegalArgumentException(new NullPointerException()); 
} catch (IllegalArgumentException iae) { 
    // handle illegal argument... 
    throw iae.getCause(); // throws the cause (the NullPointerException) 
} 
6

Throwing hơn một ngoại lệ duy nhất không có ý nghĩa bởi vì bạn không thể có nhiều hơn một lỗi duy nhất (các lỗi có thể có nhiều lý do nhưng không thể có nhiều hơn một lỗi duy nhất bất kỳ lúc nào).

Nếu bạn cần phải theo dõi trong những lý do, bạn có thể chuỗi trường hợp ngoại lệ:

} catch (Exception ex) { 
    throw new RuntimeException("Exc while trying ...", ex); 
} 

Đây là có sẵn thông qua getCause().

+6

Vui lòng không khuyến khích mọi người nắm bắt cơ sở 'Ngoại lệ'. Ngoài ra, để đóng gói lại các ngoại lệ, tôi là một lớp cơ sở ngoại lệ cụ thể của dự án. Bằng cách này tôi có thể phân biệt giữa các trường hợp ngoại lệ có thể chấp nhận, những ngoại lệ mà tôi đã gói và đang lập kế hoạch, và một ngoại lệ không mong muốn. – unholysampler

+1

@unholysampler: Đồng ý. –

3

Bạn có thể có khả năng ném nhiều ngoại lệ khác nhau. Ví dụ:

if (obj == null) 
    throw new NullPointerException(); 

if (some other case) 
    throw new IllegalArgumentException(); 

if (this == this) 
    throw new IOException(); 

Mã này có thể ném nhiều ngoại lệ khác nhau, nhưng điều này không bao giờ có thể xảy ra cùng một lúc.

19

Tôi cho rằng bạn có thể tạo ra một ngoại lệ chứa danh sách các trường hợp ngoại lệ bị bắt và ném ngoại lệ đó, ví dụ .:

class AggregateException extends Exception { 
    List<Exception> basket; 
} 
11

Một phương pháp có thể ném một trong vài trường hợp ngoại lệ. Ví dụ:

public void dosomething() throws IOException, AWTException { 
     // .... 
} 

này báo hiệu rằng phương pháp này cuối cùng có thể ném một của hai trường hợp ngoại lệ (và cũng có thể bất kỳ trường hợp ngoại lệ được kiểm soát). Bạn không thể (trong Java hoặc bất kỳ ngôn ngữ AFAIK) ném đồng thời hai ngoại lệ, điều đó sẽ không có ý nghĩa nhiều.

Bạn cũng có thể ném lồng nhau Ngoại lệ, chứa bên trong một đối tượng ngoại lệ khác. Nhưng điều đó hầu như không tính rằng "ném hai ngoại lệ", nó chỉ đại diện cho một trường hợp ngoại lệ duy nhất được mô tả bởi hai đối tượng ngoại lệ (thường xuyên từ các lớp khác nhau).

+0

rất hữu ích, câu trả lời hay nhất –

5

Tôi đã nhìn thấy một mô hình, nơi một ngoại lệ tùy chỉnh trong nội bộ lưu trữ trường hợp ngoại lệ khác (không thể nhớ, tại sao họ đã làm điều đó), nhưng nó giống như:

public class ContainerException extends Exception { 

    private List<Exception> innerExeptions = new Arrayist<Exception>(); 

    // some constructors 

    public void add(Exception e) { 
    innerExceptions.add(e); 
    } 

    public Collection<Exception> getExceptions() { 
    return innerExceptions; 
    } 
} 

và nó được sử dụng như thế này:

try { 
    // something 
} catch (ContainerException ce) { 
    ce.add(new RunTimeException("some Message"); 
    throw ce; // or do something else 
} 

Sau đó trong mã, ngoại lệ vùng chứa được đánh giá và bán phá giá vào tệp nhật ký.

3

Mẫu được mô tả bởi Andreas_D chắc chắn hữu ích bất cứ khi nào bạn xử lý, nói, biên dịch phía máy chủ của tệp do người dùng cung cấp và muốn báo cáo lại lỗi.

Ví dụ: bạn có thể có CompilationException được tạo nếu tài nguyên không biên dịch được. Biên dịch có thể có nghĩa là bất kỳ số thứ nào. Ví dụ: bạn có thể đánh giá văn bản bên trong tệp mà người dùng cuối tải lên, phân tích mã thông báo, kiểm tra lỗi cú pháp và xác định xem tệp có hợp lệ hay không. Cuối cùng, điều này là hợp lệ hoặc nó không hợp lệ và bạn muốn trao lại một CompilationException thích hợp để truyền bá lại ngăn xếp cuộc gọi.

Giống như Andreas mô tả, bạn có thể có phương thức add() cho phép bạn thêm các vấn đề biên dịch vào ngoại lệ của mình. Những vấn đề đó không phải là ngoại lệ, nhưng điều đó tùy thuộc vào bạn. Nó thường giúp gắn bó với một khung ngoại lệ duy nhất để bạn có thể sử dụng cùng một logic xác nhận ở nhiều nơi.

Ở mức độ nào, những gì bạn muốn là một CompilationException duy nhất rơi trở lại qua ngăn xếp cuộc gọi vì điều đó cho khung làm việc mà điều đó không biên dịch. Nếu bất kỳ ai trong chuỗi muốn biết lý do tại sao, thì họ có thể gặp phải các vấn đề cơ bản với một cuộc gọi đến, ví dụ: getCauses().

Nó cũng hữu ích từ góc độ giao diện người dùng. Thông tin đó gắn bó xung quanh ngoại lệ có thể được xử lý đúng cách trước khi quay lại dây để bạn có thể cung cấp cho người dùng cuối một số thông tin về lý do biên dịch thất bại.

0

có cách để một phương thức để loại bỏ các đệ trình mutiple, nhưng không phải tại một thời điểm. ví dụ. khi biên dịch không thành công vì một số lý do, phương thức của bạn chỉ có thể ném một ngoại lệ. nếu bạn phải bao gồm các cơ hội khác nhau, bạn có thể khai báo phương thức của bạn để ném lớp cha của tất cả các ngoại lệ "Ngoại lệ". vì vậy, nếu bạn khai báo một phương thức để ném một ngoại lệ nói chung, một ngoại lệ của bất kỳ loại nào có thể được ném bằng phương pháp này.

ví dụ:

public static void main(String[] args) throws Exception 
{ 
    getClipboard(); // throws an UnsupportedFlavorException 
    initIOActivity(); // throw an IOException 
} 

tôi không biết những gì bạn thực sự cần biết nhưng có lẽ điều này sẽ giúp. mặc dù nó đã trôi qua rất nhiều thời gian kể từ khi bài viết của bạn ^^

lời chào

+0

nếu bạn muốn ném nhiều ngoại lệ như thế bạn thực sự nên xác định phương thức của mình là 'phương thức void công cộng() ném UnsupportedSomethingException, IOException {...}'. Sử dụng 'Exception' chính nó là một cách nhanh chóng để mất rất nhiều sức mạnh bạn nhận được từ xử lý ngoại lệ một cách chính xác. Tôi chỉ khuyên bạn nên bắt ngoại lệ trong một chuỗi giao diện người dùng hoặc ở một số cấp cao nhất chỉ để tránh một sự cố đầy đủ. – indivisible

2

Để ném nhiều trường hợp ngoại lệ trong Java đầu tiên bạn sẽ phải ngăn chặn từng ngoại lệ vào một ngoại lệ tùy chỉnh và sau đó ném ngoại lệ tùy biến tương tự. Vui lòng kiểm tra đoạn mã bên dưới để đạt được điều tương tự.

public class AggregateException extends Exception { 


     public void addException(Exception ex){ 

     addSuppressed(ex); 
     exception = true; 
    } 
} 


public class AnyClass{ 

    public AggregateException aggExcep = new AggregateException(); 

    public void whereExceptionOccurs(){ 
     try{ 

       //some code 
     }catch(Exception e){ 

       aggExcep.addException(e); 
       //throw aggExcep; 
     } 
    } 
} 

Gọi phương thức addException bất cứ nơi nào bạn muốn (Bên trong khối catch rõ ràng) loại bỏ mọi ngoại lệ. Và ở cuối một cách rõ ràng ném aggExcep bằng cách sử dụng 'ném' từ khóa mà bao giờ bạn muốn.

Các

trống addSuppressed (Throwable ngoại lệ)

là một phương pháp được xác định trước của lớp Throwable mà gắn thêm các ngoại lệ quy định để các trường hợp ngoại lệ mà bị đàn áp để cung cấp ngoại lệ này.

0

Tôi không chắc chắn liệu bạn có đang hỏi xem có thể ném nhiều ngoại lệ cùng một lúc hay không hoặc chúng tôi có thể có mã để xử lý nhiều ngoại lệ cùng một lúc. Tôi sẽ cố gắng trả lời cả hai. Đây là câu trả lời đầu tiên của tôi trên StackOverflow vì vậy hãy tha thứ cho bất kỳ lỗi nào.

1) Nếu bạn muốn ném nhiều ngoại lệ cùng một lúc, tôi nghĩ bạn không thể làm điều đó. Hãy xem xét một tình huống tương tự. Khi bạn đang giải quyết một câu hỏi về Toán và đạt đến một điểm mà bạn đang chia cho 0, chỉ có một lỗi ở ĐIỂM NÀY và được chia cho 0. Vì vậy, tôi đoán bạn chỉ có thể ném một lỗi cho một tuyên bố nhất định. Tuy nhiên, có thể tồn tại nhiều câu lệnh trong khối try try của bạn, mỗi câu lệnh có thể ném một lỗi khác.

2) NẾU bạn muốn xử lý/bắt nhiều lỗi, có hai cách để thực hiện. i) Trước Java 7:

`try{ 
    ... 
    //some method/action that can be a cause of multiple errors,say X and Y 
    ... 
}catch(XException e){ 
     //Do something if exception X arises. 
}catch(YException e){ 
     //Do something if exception Y arises. 
} 
` 

ii) Sau Java 7, bạn có tính năng bắt đa.

try{ 
    ... 
    //some method/action that can be a cause of multiple errors,say X and Y 
    ... 
}catch(XException|YException e){ 
    // Take action appropriate to both types of exception. 
    ... 
} 

Tôi tin rằng điều này sẽ giải quyết được sự nghi ngờ của bạn. Đây là câu trả lời đầu tiên của tôi, tất cả các đề xuất đều được hoan nghênh!