Java 在catch块中重新抛出异常有意义吗?
从catch块抛出异常只是为了记录消息,以便我们确定是什么导致了异常,这有意义吗 代码Java 在catch块中重新抛出异常有意义吗?,java,exception,Java,Exception,从catch块抛出异常只是为了记录消息,以便我们确定是什么导致了异常,这有意义吗 代码 public void saveLogs(Logs logs) throws RemoteException { try { LogsOps.saveLogs(logs); } catch (RemoteException e) { log.info("RemoteExcep
public void saveLogs(Logs logs) throws RemoteException
{
try
{
LogsOps.saveLogs(logs);
}
catch (RemoteException e)
{
log.info("RemoteException is thrown while trying to save logs ", e);
throw new RemoteException("RemoteException caused while trying to save", e);
}
}
为了回应下面的一条评论,即此方法将引发StackOverFlow异常,这里是log.info的实际实现,它仅显示这些错误
/** Log the message and the exception with a level of INFO.
* @param message - The message text.
* @param t - An exception to display.
*/
public void info(Object message, Throwable t)
{
String nullSafeMessage = (message != null) ? message.toString() : t.getClass().getSimpleName();
log.info(nullSafeMessage, t);
}
所以不会抛出Stackoverflow异常 这取决于什么将捕获更高级别的异常。如果没有其他东西记录该消息,那么当然,这是有意义的——尽管我可能会重新显示原始异常,而不是创建新异常:
catch (RemoteException e)
{
log.info("RemoteException is thrown while trying to save logs ", e);
throw e;
}
但是,理想情况下,您应该在堆栈的更高位置有一个catch
块,该块将适当地记录-如果您只是记录异常,那么它仍然可以获取所有信息
当您想要记录异常中不存在的信息(如参数值)时,捕获/log/rethrow可能是有意义的。假定您最终将处理传播的异常,这种捕获日志rethrow的策略只会使日志文件变得杂乱无章。想象一下,这在stacktrace的整个过程中都完成了—您最终会得到大量无用的冗余错误信息
如果您没有处理异常,也不应该将其记录下来。除了记录之外,这种方法还可以用于在将控制返回给堆栈更上层的调用方之前,在发生故障时执行必要的清理 比如说
InputStream is = new InputStream( ... )
try {
is.read(...);
return is;
} catch ( IOException ioe ) {
is.close();
throw ioe;
}
当然,这是一个有点特殊的用法,大多数情况下可以通过使用
finally
子句优雅地避免,但并非总是如此,如上例所示。stacktrace不包含源代码吗?消息应该尽可能描述以避免这种情况。但我很少看到它完成。除非没有其他东西要记录它。你真的要记录抛出到日志中的异常吗?那将是StackOverFlow例外@TejaswiRana:我没有看到它抛出StackOverFlow异常,为什么你认为它会抛出Stack Over Flow异常?请看我更新的问题。如果LogOps.saveLogs(logs)确实抛出RemoteException,它就不会被捕获。只是好奇->您在SaveLogs中的日志和在log.info中的日志是两件不同的事情?在我看来,它们是一样的,log.info实际上并没有写入,但会保存到日志集合中,然后以一定的间隔保存。log.info是我们正在使用的标准日志记录器,而save Logs是应用程序中的一个页面,它捕获每个解析作业请求的解析日志的详细信息,希望这能澄清。同意,但就我而言,我正在用一般日志消息捕获更高级别的异常,但我想捕获特定的消息,说明抛出当前RemoteException的原因和时间,以便在我们遇到一些问题时从调试应用程序的角度来看更容易。@Rachel我知道的任何该死的记录器都会打印方法名和类名,所以您不需要特定的信息。如果您只想打印消息并继续,还可以使用Exception.getMessage
。