2012-02-26 37 views
6

Tôi đang viết một thư viện bao quanh một API REST. Các wrapper tôi đang tạo sử dụng GSON để deserialize các json vào đối tượng của tôi. Về cơ bản, một cái gì đó như thế này ...Cách xử lý đúng cách các ngoại lệ không được kiểm soát quan trọng

public Post getPost(url) throws IOException { 
    String jsonString = httpClient.get(url); 
    Post p = gson.fromJson(jsonString, Post.class); 
    // return Post to client and let client do something with it. 
} 

Nếu tôi hiểu đúng, IOException là ngoại lệ được kiểm tra. Tôi đang nói với khách hàng của tôi: Này, bạn thân - bạn tốt hơn xem ra và phục hồi từ ngoại lệ này. Bây giờ khách hàng của tôi có thể kết thúc cuộc gọi trong một thử/nắm bắt và xác định phải làm gì nếu có một số lỗi mạng.

Phương thức GSON fromJson() ném ra một JsonSyntaxException. Tôi tin rằng điều này là không được kiểm soát trong thế giới Java, như là một trong các lớp siêu của nó là RuntimeException, và cũng bởi vì tôi không cần phải thêm một try/catch hoặc một "ném" như IOException.

Giả sử những gì tôi đã nói cho đến thời điểm này là chính xác - API và khách hàng xử lý tình huống này như thế nào? Nếu chuỗi json là rác, khách hàng của tôi sẽ thất bại thảm hại do JsonSyntaxException vì nó không được kiểm tra.

// Client 
PostService postService = new PostService(); 
try{ 
    Post p = postService.getPost(urlString); 
    // do something with post 
}catch (IOException){ 
    // handle exception 
} 
// ok, what about a JsonSyntaxException???? 

Cách tốt nhất để xử lý các tình huống này là gì?

Trả lời

6

Bạn được phép nắm bắt các ngoại lệ không được kiểm soát. Chỉ cần thêm catch(JsonSyntaxException e) vào khối try-catch của bạn. Sau khi bạn bắt được JsonSyntaxException, bạn có thể xử lý hoặc xem lại nó dưới dạng ngoại lệ đã kiểm tra.

Ex:

try{ 
    //do whatever 
}catch(JsonSyntaxException e){ 
    e.printStackTrace(); 
    // throw new Exception(e); //checked exception 
}catch(IOException e){ 
    e.printStackTrace(); 
} 
+0

Đây có phải là trong mã khách hàng? Nếu vậy, làm thế nào khách hàng có thể biết rằng một JsonSyntaxException có thể được ném? – CodeBlue

+0

@CodeBlue Điều này có thể là trong mã khách hàng (họ sẽ biết nó có thể được ném bởi vì API của bạn có thể chỉ định rằng nó có thể được ném) hoặc nó có thể nằm trong phương thức 'getPost' của bạn. Nếu nó nằm trong phương thức 'getPost' của bạn, bạn sẽ không nắm bắt' IOException', bạn sẽ chuyển giao 'JsonSyntaxException' cùng với một ngoại lệ đã kiểm tra. – Jeffrey

+0

Ok. Cảm ơn bạn đã làm rõ. – CodeBlue

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