Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在catch块中重新抛出异常有意义吗?_Java_Exception - Fatal编程技术网

Java 在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

从catch块抛出异常只是为了记录消息,以便我们确定是什么导致了异常,这有意义吗

代码

  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