9.6 例子:独立的记录类

第二个例子涉及一个学生项目中的错误日志记录。一个类包含了如下几行代码:

try { 
    rpcConn = connectionPool.getConnection(dest); 
} catch (IOException e) { 
    NetworkErrorLogger.logRpcOpenError(req, dest, e); 
    return null; 
}

不是在检测到错误的地方记录错误日志,而是调用一个特殊的错误日志记录类中的单独方法。该错误日志记录类是在同一源文件的末尾定义的:

private static class NetworkErrorLogger {
    /** 
    * Output information relevant to an error that occurs when trying 
    * to open a connection to send an RPC.
    * 
    * @param req 
    *     The RPC request that would have been sent through the 
            connection 
    * @param dest 
    *     The destination of the RPC 
    * @param e 
    *     The caught error 
    */ 
    public static void logRpcOpenError(RpcRequest req, AddrPortTuple 
                dest, Exception e) { 
        logger.log(Level.WARNING, "Cannot send message: " + req + ". \n" + 
                "Unable to find or open connection to " + dest + " :" + 
                e); 
    }
... 
}

NetworkErrorLogger类包含几个方法,如logRpcSendErrorlogRpcReceiveError,每个方法都记录了不同种类的错误日志。

这种分离增加了复杂性,却没有任何好处。日志记录方法是浅的:它们大多由一行代码组成,但需要大量的文档。每个方法只在一个地方被调用。日志记录方法高度依赖于它们的调用:阅读调用的人很可能会切换到日志记录方法,以确保记录了正确的信息;同样,阅读日志记录方法的人可能会切换到调用的地方,以了解该方法的目的。

在这个例子中,最好是消除日志记录方法并将日志记录语句放在检测到错误的位置。这将使代码更易于阅读,并消除日志记录方法所需的接口。

Last updated