2012-11-14 18 views
18

Tôi có một tuyên bố ném rất nhiều ngoại lệ đã kiểm tra. Tôi có thể thêm tất cả các khối catch cho tất cả chúng như thế này:Có thể bắt tất cả ngoại lệ ngoại trừ thời gian chạy ngoại lệ không?

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(IOException ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} catch(ClassCastException ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} catch... 

Tôi không thích điều này vì họ được xử lý tất cả cùng một cách như vậy không loại trùng lặp mã và cũng có rất nhiều mã để viết. Thay vào đó có thể bắt Exception:

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(Exception ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} 

Đó sẽ là ok, ngoại trừ tôi muốn tất cả các trường hợp ngoại lệ thời gian chạy được vứt bỏ mà không bị bắt. Có giải pháp nào cho điều này không? Tôi đã nghĩ rằng một số tuyên bố chung thông minh của loại ngoại lệ để được đánh bắt có thể làm các trick (hoặc có thể không).

Trả lời

40

Bạn có thể làm như sau:

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(RuntimeException ex) { 
    throw ex; 
} catch(Exception ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} 
+2

câu trả lời hay ... +1 – Juvanis

+2

+1 Tuyệt. Không rõ ràng nhất mà tôi từng thấy nhưng có phải là trò lừa không. – drasto

11

Nếu bạn có thể sử dụng Java 7, bạn có thể sử dụng một Multi-Catch:

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(IOException|ClassCastException|... ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} 
+0

+1 cảnh báo cho tôi về tính năng IMO có giá trị (và dài quá hạn) mới này trong Java 7 –

+0

+1 Vì lý do này tôi sẽ sử dụng Java 7 nếu có thể. Nhưng tôi không thể và tôi rất tiếc vì điều này vì Multi-Catch là hoàn hảo. Tôi phải sử dụng Java 6: ((( – drasto

1

Bạn có thể thử một cái gì đó như thế này, về cơ bản nắm bắt tất cả mọi thứ và sau đó tái ném RuntimeException nếu nó là một thể hiện của lớp đó ...

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(Exception ex) { 
    if (ex instanceof RuntimeException){ 
     throw ex; 
    } 
    else { 
     throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
    } 
} 

Thấy như thể đây sẽ là lộn xộn để viết hơn và hơn nữa (và xấu cho khả năng bảo trì), tôi có thể chuyển mã vào một lớp học khác nhau, một cái gì đó như thế này ...

public class CheckException { 
    public static void check(Exception ex, String message) throws Exception{ 
     if (ex instanceof RuntimeException){ 
      throw ex; 
     } 
     else { 
      throw new MyCustomInitializationException(message, ex); 
     } 
    } 
} 

Và sử dụng nó trong mã của bạn như thế này ...

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(Exception ex) { 
    CheckException.check(ex,"Class Resolver could not be initialized."); 
} 

Ghi nhận rằng chúng ta vượt qua trong các message để chúng ta vẫn có thể tùy chỉnh MyCustomInitializationException của chúng tôi.

+0

Tùy chọn cuối cùng sẽ là tốt nếu tôi cần phải làm điều đó nhiều lần nhưng đó không phải là trường hợp của tôi - tôi chỉ cần sử dụng nó một lần. Tôi chỉ cần parametrize phương thức tĩnh với 'String 'message. – drasto

+0

bạn cần bỏ' ex' thành 'RuntimeException' trong mã. –