2017-03-20 45 views
0

我正在使用Gson來處理Json響應。有時我會遇到異常,但不幸的是我沒有足夠的上下文來查明問題的確切位置。記錄通過InputStream的所有內容

的JsonReader創建如下:

private JsonReader getJsonReader(final HttpEntity entity) throws IOException { 
    final InputStreamReader reader = new InputStreamReader(entity.getContent(), StandardCharsets.UTF_8); 
    return new JsonReader(reader); 
} 

我的想法是繼承InputStreamReader和記錄,通過它,爲了有更多的背景下,當一個異常被拋出去的一切。

有沒有更好的方法?

+0

「更好」是一個非常模糊的術語。我認爲你的想法是合理的:實施應該相當容易;並且不需要對您的代碼庫進行任何「戲劇性」更改。 – GhostCat

+0

這個例外通常應該包含足夠的上下文(傑克遜例外在這方面肯定從未讓我失望)。這將取決於我猜想的框架。子類化'InputStream'或者簡單地使用調試器應該能夠指出問題。 – john16384

+1

1)'JsonReader.toString()'輸出當前的解析位置。這是一個好的背景嗎? 2)如果有必要,我會繼承'JsonReader',而不是'InputStreamReader':'JsonReader'通過設計剝離了多餘的令牌。 (假設一個漂亮打印/格式化的輸入流會記錄每個空格,而裝飾了'JsonReader'只會記錄JSON令牌)。 –

回答

0

我創建了以下兩個子類:

public class LoggingReader extends InputStreamReader { 

    private char[] lastRead; 

    public LoggingReader(final InputStream inputStream, final Charset charset) { 
     super(inputStream, charset); 
    } 

    @Override 
    public int read(final char[] chars, final int i, final int i1) throws IOException { 
     final int result = super.read(chars, i, i1); 
     lastRead = chars; 
     return result; 
    } 

    public String getLastRead() { 
     return new String(lastRead); 
    } 
} 

public class LoggingJsonReader extends JsonReader { 
    private final LoggingReader reader; 
    public LoggingJsonReader(final LoggingReader in) { 
     super(in); 
     this.reader = in; 
    } 

    public String getLastRead() { 
     return reader.getLastRead(); 
    } 
} 

現在,當一個異常被拋出我做的:

catch (Exception ex) { 
    if (reader instanceof LoggingJsonReader) { 
    LoggingJsonReader lReader = (LoggingJsonReader) reader; 
    log.error(lReader.getLastRead()); 
    } 
相關問題