Catching unthrowed exceptions

G

GlassyCitizen

Gast
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
 
G

GlassyCitizen

Gast
>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
 
M

maki

Gast
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.
 
S

SlaterB

Gast
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)
 
G

GlassyCitizen

Gast
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
 
G

GlassyCitizen

Gast
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)

Moment, eclipse ist noch auf...
 
G

GlassyCitizen

Gast
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)

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
 

Ähnliche Java Themen

Neue Themen


Oben