我有以下代码使用hibernate在错误时引发自定义异常,在这种情况下,我也想关闭会话,因为除非在客户端计算机上收到该异常,否则不会捕获该异常。
public <T> T get(final Session session, final String queryName) throws RemoteException { final Query query = // query using given session ... try { return (T) query.uniqueResult(); } catch (final HibernateException e) { SessionManager.logger.log(Level.SEVERE, "Could not retrieve Data", e); this.closeSession(session); throw new RemoteException("Could not retrieve Data"); } }
现在,我有一个帮助程序方法,该方法关闭会话并引发给定的异常:
public void closeSessionAndThrow(final Session session, final RemoteException remoteException) throws RemoteException { this.closeSession(session); throw remoteException; }
现在我想可以使用以下方法简化上述代码:
public <T> T get(final Session session, final String queryName) throws RemoteException { final Query query = // query using given session ... try { return (T) query.uniqueResult(); } catch (final HibernateException e) { SessionManager.logger.log(Level.SEVERE, "Could not retrieve Data", e); this.closeSessionAndThrow(session, new RemoteException("Could not retrieve Data")); } }
现在, 我需要return null;在捕获之后添加一条语句。为什么?
return null;
更改closeSessionAndThrow要返回的声明,RemoteException然后在客户端代码中“抛出”调用它的返回结果。
closeSessionAndThrow
RemoteException
public RemoteException closeSessionAndThrow( ... ) // <-- add return type here throws RemoteException { ... } public <T> T get( ... ) throws RemoteException { try { ... } catch (final HibernateException e) { throw this.closeSessionAndThrow( ... ); // <-- add "throw" here } }
这会诱使编译器认为它将始终抛出从返回的任何异常closeSessionAndThrow。由于helper方法本身会引发该异常,因此这一秒throw永远不会起作用。尽管您可以从帮助程序中返回异常,但是当有人忘记throw在调用之前添加时,这会引发错误。
throw