2015-05-14 111 views
0

我們能不能捕捉到StaleObjectStateException?我有捕獲塊與StaleObjectStateException,所以當方法拋出這個錯誤它來到這個catch塊,但仍然拋出同樣的異常再次。 我知道爲什麼這個例外來臨的原因,但我想抓住這個例外並繼續下去。無法捕捉org.hibernate.StaleObjectStateException

[13/05/15 10:00:07:751 BST] 00000053 TaskUtils$Log E org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler handleError Unexpected error occurred in scheduled task. 
            org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Object of class [com.lgs.mem.model.MemService] with identifier [3038]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.lgs.mem.model.MemService#3038] 
        at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:676) 
        at org.springframework.orm.hibernate3.SpringSessionSynchronization.translateException(SpringSessionSynchronization.java:160) 
        at org.springframework.orm.hibernate3.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:148) 
        at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:95) 
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:927) 
        at org.springframework.transaction.jta.WebSphereUowTransactionManager.access$4(WebSphereUowTransactionManager.java:1) 
        at org.springframework.transaction.jta.WebSphereUowTransactionManager$UOWActionAdapter.run(WebSphereUowTransactionManager.java:338) 
        at com.ibm.ws.uow.EmbeddableUOWManagerImpl.runUnderNewUOW(EmbeddableUOWManagerImpl.java:786) 
        at com.ibm.ws.uow.EmbeddableUOWManagerImpl.runUnderUOW(EmbeddableUOWManagerImpl.java:365) 
        at org.springframework.transaction.jta.WebSphereUowTransactionManager.execute(WebSphereUowTransactionManager.java:281) 
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:127) 
        at at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    at $Proxy156.updateRetryCountAndTSP(Unknown Source) 
    at com.lgs.mem.service.impl.MemDAOServiceImpl.updateRetryCountAndTSP(MemDAOServiceImpl.java:181) 
    at com.lgs.mem.scheduler.MEMRecoveryScheduler.processFailedNicheRequests(MEMRecoveryScheduler.java:82) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:611) 
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:64) 
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:53) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:452) 
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:328) 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:161) 
    at org.springframework.scheduling.commonj.TimerManagerTaskScheduler$TimerScheduledFuture.timerExpired(TimerManagerTaskScheduler.java:112) 
    at org.springframework.scheduling.commonj.TimerManagerTaskScheduler$ReschedulingTimerListener.timerExpired(TimerManagerTaskScheduler.java:165) 
    at com.ibm.ws.asynchbeans.timer.TimerImpl.callListenerMethod(TimerImpl.java:361) 
    at com.ibm.ws.asynchbeans.timer.GenericTimer.run(GenericTimer.java:228) 
    at com.ibm.ws.asynchbeans.J2EEContext$RunProxy.run(J2EEContext.java:265) 
    at java.security.AccessController.doPrivileged(AccessController.java:252) 
    at javax.security.auth.Subject.doAs(Subject.java:495) 
    at com.ibm.websphere.security.auth.WSSubject.doAs(WSSubject.java:132) 
    at com.ibm.websphere.security.auth.WSSubject.doAs(WSSubject.java:90) 
    at com.ibm.ws.asynchbeans.J2EEContext$DoAsProxy.run(J2EEContext.java:336) 
    at java.security.AccessController.doPrivileged(AccessController.java:280) 
    at com.ibm.ws.asynchbeans.J2EEContext.run(J2EEContext.java:1174) 
    at com.ibm.ws.asynchbeans.timer.TimerImpl.runListenerAsCJWork(TimerImpl.java:490) 
    at com.ibm.ws.asynchbeans.am._Alarm.fireAlarm(_Alarm.java:333) 
    at com.ibm.ws.asynchbeans.am._Alarm.run(_Alarm.java:230) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1659) 
Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.lgs.mem.model.MemService#6768] 
    at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1950) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2595) 
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2495) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2822) 
    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:113) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 
    at org.springframework.orm.hibernate3.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:145) 
    ... 38 more 
+1

顯示相關代碼 – Chaitanya

回答

0

是的,你可以發現異常。

如果異常不會傳播到您試圖捕獲它的地方,則會發生類似這樣的問題。例如:

  • 它可能被拋出在不同的線程上。
  • 它可能會進一步向上堆疊,然後作爲不同的異常重新拋出。

從stacktrace判斷,我想說這是第二種解釋。最初的例外已被捕獲,並已創建一個包裝它的HibernateOptimisticLockingFailureException。這是你看到的後一個例外。

如果要專門處理原始異常,則可能需要捕獲HibernateOptimisticLockingFailureException(或超類),然後調用異常對象的getMostSpecificCause()以提取原始異常以進行診斷。

+0

該控件不會去HibernateOptimisticLockingFailureException catch塊,而是它會去StaleObjectStateException並再次拋出,意味着我仍然可以看到堆棧跟蹤。 – Reddy

+0

我不明白你在說什麼。堆棧跟蹤清楚地表明,實際記錄的異常是HOLFE,而不是SOSE。 –

+0

是的,但仍然是異常拋出的方法和控制只是退出該方法,但我希望在捕捉異常後繼續該方法。我已經閱讀了一些有關這個HOLFE將被拋出交易的信息。 – Reddy