# Catching unthrowed exceptions



## GlassyCitizen (24. Sep 2012)

Liebe Kollegen,

ich habe eine allgemeine Frage, die in folgendem Kontext auftaucht: ich programmiere zur Zeit eine Art Applet auf dem SAP EP J2EE Server und versuche mir in diesem zur Laufzeit eine Objekt zu holen, etwa in der Form:

INavigationService navigationService = (INavigationService) PortalRuntime.getRuntimeResources().getService(INavigationService.KEY);
String navTarget = StringUtils.substringAfter(path,"NavigationTarget=");
String navTargetName = navigationService.getNavigationNodeOriginalName(env, navTarget);
INavigationNode navNode = null;            
navNode = navigationService.getNode(env, navTargetName); 

Dabei können von der getNode Methode ggf. zwei verschiedene exceptions geworfen werden: eine wegen fehlenden Rechten um auf das Objekt zuzugreifen und eine die besagt, dass das angeforderte Objekt nicht existiert. Auf beide Ausnahmen muss ich im Rahmen der Anwendung verschieden reagieren, beide Ausnahmen werden jedoch weiter oben im stack abgefangen (kann ich im Log sehen), so dass Dinge wie:


          try {
            navNode = navigationService.getNode(env, navTargetName); 
          }
          catch (PermissionControlException e) { ... }
          catch (NameNotFoundException e) { ... }

natürlich mit "unreachable block" scheitern. In beiden Fällen ist navNode jedenfalls null, mir fehlt jedoch die Information aus welchen Grund. Während bei Zugriffsberechtigungsproblemen ich nichts tun müsste, gäbe es bei nicht existenten Objekten Handlungsbedarf.

Ich bin sicher, dass analoge Probleme und evtl. Lösungen bekannt sind, bin jedoch leider nicht fündig geworden. Falls jemand einen Hinweis zu einer Lösung oder einem workaround hat, bin ich zu Dank verpflichtet.

VG


----------



## maki (24. Sep 2012)

> Dabei können von der getNode Methode ggf. zwei verschiedene exceptions geworfen werden:


Wo steht das?

Zumindest laut der API Doku die ich ergoogelt habe (INavigationService (Enterprise Portal (SPS 15))) wirft diese Methode gar keine Exceptions.


----------



## GlassyCitizen (24. Sep 2012)

>Wo steht das?
>
>Zumindest laut der API Doku die ich ergoogelt habe (INavigationService (Enterprise Portal (SPS 15))) >wirft diese Methode gar keine Exceptions. 

Danke, das ist natürlich richtig, die fliegen weiter "oben", zum besseren Verständniss des Problems der stack:


Exception 
[EXCEPTION] 
com.sapportals.portal.prt.runtime.PortalRuntimeException: Access is denied: 
xxxxxxxx - user: 
at com.sap.portal.prt.core.PortalSecurityManager.checkPermissions(PortalSecurityManager.java:140) 
at com.sap.portal.prt.core.PortalSecurityManager.checkPermissions(PortalSecurityManager.java:71) 
at com.sapportals.portal.prt.service.hook.SecurityHookService.performPermissionsCheck(SecurityHookService.java:240) 
at com.sapportals.portal.prt.service.hook.SecurityHookService.doNodeHook(SecurityHookService.java:217) 
at com.sapportals.portal.prt.connection.PortalHook.doNodeHook(PortalHook.java:383) 
at com.sap.portal.prt.pom.factory.ComponentNodeFactory.newInstance(ComponentNodeFactory.java:136) 
at com.sap.portal.prt.pom.factory.ComponentNodeFactory.newInstance(ComponentNodeFactory.java:49) 
at com.sap.portal.prt.pom.PortalNode.createComponentNode(PortalNode.java:270) 
at com.sapportals.portal.prt.connection.ContentExceptionHandler.handleException(ContentExceptionHandler.java:58) 
at com.sapportals.portal.prt.connection.ContentExceptionHandler.handlePortalRuntimeException(ContentExceptionHandler.java:32) 
at com.sap.portal.prt.core.PortalRequestManager.handleRequestException(PortalRequestManager.java:749) 
at com.sap.portal.prt.core.PortalRequestManager.runRequestCycle(PortalRequestManager.java:617) 
at com.sapportals.portal.prt.connection.ServletConnection.handleRequest(ServletConnection.java:201) 
at com.sap.portal.prt.dispatcher.DispatcherServlet.service(DispatcherServlet.java:132) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
at com.sap.engine.services.servlets_jsp.server.runtime.FilterChainImpl.runServlet(FilterChainImpl.java:202) 
at com.sap.engine.services.servlets_jsp.server.runtime.FilterChainImpl.doFilter(FilterChainImpl.java:103) 
at com.sap.portal.http.EnrichNavRequestFilter.doFilter(EnrichNavRequestFilter.java:49) 
at com.sap.engine.services.servlets_jsp.server.runtime.FilterChainImpl.doFilter(FilterChainImpl.java:79) 
at com.sap.portal.http.EnrichNavRequestFilter.doFilter(EnrichNavRequestFilter.java:49) 
at com.sap.engine.services.servlets_jsp.server.runtime.FilterChainImpl.doFilter(FilterChainImpl.java:79) 
at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.runServlet(HttpHandlerImpl.java:432) 
at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.handleRequest(HttpHandlerImpl.java:210) 
at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:441) 
at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:430) 
at com.sap.engine.services.servlets_jsp.filters.DSRWebContainerFilter.process(DSRWebContainerFilter.java:38) 
at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:78) 
at com.sap.engine.services.servlets_jsp.filters.ServletSelector.process(ServletSelector.java:81) 
at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:78) 
at com.sap.engine.services.servlets_jsp.filters.ApplicationSelector.process(ApplicationSelector.java:276) 
at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:78) 
at com.sap.engine.services.httpserver.filters.WebContainerInvoker.process(WebContainerInvoker.java:81) 
at com.sap.engine.services.httpserver.chain.HostFilter.process(HostFilter.java:9) 
at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:78) 
at com.sap.engine.services.httpserver.filters.ResponseLogWriter.process(ResponseLogWriter.java:60) 
at com.sap.engine.services.httpserver.chain.HostFilter.process(HostFilter.java:9) 
at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:78) 
at com.sap.engine.services.httpserver.filters.DefineHostFilter.process(DefineHostFilter.java:27) 
at com.sap.engine.services.httpserver.chain.ServerFilter.process(ServerFilter.java:12) 
at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:78) 
at com.sap.engine.services.httpserver.filters.MonitoringFilter.process(MonitoringFilter.java:29) 
at com.sap.engine.services.httpserver.chain.ServerFilter.process(ServerFilter.java:12) 
at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:78) 
at com.sap.engine.services.httpserver.filters.SessionSizeFilter.process(SessionSizeFilter.java:26) 
at com.sap.engine.services.httpserver.chain.ServerFilter.process(ServerFilter.java:12) 
at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:78) 
at com.sap.engine.services.httpserver.filters.MemoryStatisticFilter.process(MemoryStatisticFilter.java:57) 
at com.sap.engine.services.httpserver.chain.ServerFilter.process(ServerFilter.java:12) 
at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:78) 
at com.sap.engine.services.httpserver.filters.DSRHttpFilter.process(DSRHttpFilter.java:43) 
at com.sap.engine.services.httpserver.chain.ServerFilter.process(ServerFilter.java:12) 
at com.sap.engine.services.httpserver.chain.AbstractChain.process(AbstractChain.java:78) 
at com.sap.engine.services.httpserver.server.Processor.chainedRequest(Processor.java:475) 
at com.sap.engine.services.httpserver.server.Processor$FCAProcessorThread.process(Processor.java:269) 
at com.sap.engine.services.httpserver.server.rcm.RequestProcessorThread.run(RequestProcessorThread.java:56) 
at com.sap.engine.core.thread.execution.Executable.run(Executable.java:122) 
at com.sap.engine.core.thread.execution.Executable.run(Executable.java:101) 
at com.sap.engine.core.thread.execution.CentralExecutor$SingleThread.run(CentralExecutor.java:328) 
Caused by: com.sapportals.portal.pcd.gl.PermissionControlException: Access denied (Object(s): com.sap.portal.system/security/xxxxxxxx/NetWeaver.Portal/no_safety/xxxxxxxxx/components/aboRefresh) 
at com.sapportals.portal.pcd.gl.PcdPersContext.filteredLookup(PcdPersContext.java:790) 
at com.sapportals.portal.pcd.gl.PcdPersContext.deepFilteredLookup(PcdPersContext.java:618) 
at com.sapportals.portal.pcd.gl.PcdFilterContext.filterLookup(PcdFilterContext.java:488) 
at com.sapportals.portal.pcd.gl.PcdProxyContext.recursiveLookup(PcdProxyContext.java:2086) 
at com.sapportals.portal.pcd.gl.PcdProxyContext.proxyLookupLink(PcdProxyContext.java:2189) 
at com.sapportals.portal.pcd.gl.PcdProxyContext.proxyLookup(PcdProxyContext.java:2125) 
at com.sapportals.portal.pcd.gl.PcdProxyContext.lookup(PcdProxyContext.java:1843) 
at com.sapportals.portal.pcd.gl.PcdGlContext.lookup(PcdGlContext.java:120) 
at com.sapportals.portal.pcd.gl.PcdProxyContext.lookup(PcdProxyContext.java:1824) 
at com.sapportals.portal.pcd.gl.PcdProxyContext.lookup(PcdProxyContext.java:1810) 
at javax.naming.InitialContext.lookup(InitialContext.java:392) 
at javax.naming.InitialContext.lookup(InitialContext.java:392) 
at com.sap.portal.prt.core.PortalSecurityManager.checkPermissions(PortalSecurityManager.java:111) 
... 57 more 


Hilft das?

VG


----------



## maki (24. Sep 2012)

> Hilft das?


Nö, da gibt es nix zu helfen 

Wenn da keine Exception fliegt beim Aufruf der Methode, kannst du keine fangen, so einfach ist das.
Wenn die Exception eben schon intern gefangen/behandelt und eben nicht weitergeworfen wird, kann man da nix machen.


----------



## SlaterB (24. Sep 2012)

na, man kann doch vielleicht die PortalRuntimeException catchen?
zumindest wenn sie für diese Methode im catch fliegt, wonach es dem StackTrace nach nicht aussieht, 
aber wenn dann hätte
> catch(PortalRuntimeException e)
schon eher eine Wirkung, und RuntimeException stehen nicht zwingend an Methoden, da kann der Compiler dann auch nicht meckern

im Zweifel testweise
> catch(Throwable t)


----------



## GlassyCitizen (24. Sep 2012)

maki hat gesagt.:


> Nö, da gibt es nix zu helfen
> 
> Wenn da keine Exception fliegt beim Aufruf der Methode, kannst du keine fangen, so einfach ist das.
> Wenn die Exception eben schon intern gefangen/behandelt und eben nicht weitergeworfen wird, kann man da nix machen.



ok, so etwas habe ich vermutet. Die einzige Möglichkeit, die mir aktuell einfallen würde wäre die Log auf dem Server programmatisch durchzuforsten und nach passenden Strings zu suchen, wäre aber

a)zu aufwendig in der Umsetzung angesichts des Nutzens
b)nach meinem Empfinden unsauber

Alternativ die passende SAP Klasse decompilen, dem beibringen die exception weiter zu werfen und die wieder hochladen. Aber das wäre ja noch viel schlimmer, die Konsequenzen will ich mir nicht ausmalen 

Ich werde wohl ein workaround suchen müssen, arghh.... Danke dir trotzdem für die Mühe,

VG


----------



## GlassyCitizen (24. Sep 2012)

SlaterB hat gesagt.:


> na, man kann doch vielleicht die PortalRuntimeException catchen?
> zumindest wenn sie für diese Methode im catch fliegt, wonach es dem StackTrace nach nicht aussieht,
> aber wenn dann hätte
> > catch(PortalRuntimeException e)
> ...



Moment, eclipse ist noch auf...


----------



## GlassyCitizen (24. Sep 2012)

SlaterB hat gesagt.:


> na, man kann doch vielleicht die PortalRuntimeException catchen?
> zumindest wenn sie für diese Methode im catch fliegt, wonach es dem StackTrace nach nicht aussieht,
> aber wenn dann hätte
> > catch(PortalRuntimeException e)
> ...



Nein, darauf springt der auch nicht an. Das liegt nach meinem Verständnis wie maki richtig bemerkt hat daran, dass getNode eben nicht zum werfen vorgesehen ist, was meines Erachtens ein ganz ungeschickter Schachzug seitens der SAP ist: so wie es designt ist, fallen eben alle Ausnahmen vorher. Dafür mögen die Walldorfer ihre Gründe gehabt haben, hilft mir aber erst mal nicht weiter. Hm, da bin ich auf jeden Fall erst mal mit meinem Latein am Ende, wenn also einem noch etwas einfällt...

Danke euch


----------

