this is *blogger* for cryin out loud. this morning, trying to load a user’s profile, i just got a white page with [yes i know it's screwing up my page posting it im workin on it]:
java.lang.RuntimeException: can't load class com.google.blogger.profiles.UserProfile from database
at com.google.blogger.dbreader.SqlServer.query(SqlServer.java:1639)
at com.google.blogger.profiles.BaseUserProfile.selectByUserID(BaseUserProfile.java:199)
at com.google.blogger.profiles.UserProfile.load(UserProfile.java:67)
at com.google.blogger.frontend.ProfileHandler.execute(ProfileHandler.java:70)
at com.google.servlet.handlers.AuthenticatedHandler.execute(AuthenticatedHandler.java:106)
at com.google.servlet.pipe.HandlerDispatchPipe.invoke(HandlerDispatchPipe.java:82)
at com.google.blogger.frontend.PyraJspDispatchPipe.invoke(PyraJspDispatchPipe.java:74)
at com.google.servlet.pipe.ServletPipe.invokeNextPipe(ServletPipe.java:118)
at com.google.blogger.frontend.ProfileLogPipe.invoke(ProfileLogPipe.java:49)
at com.google.servlet.pipe.ServletPipe.invokeNextPipe(ServletPipe.java:118)
at com.google.servlet.pipe.StatsPipe.invoke(StatsPipe.java:64)
at com.google.servlet.pipe.ServletPipe.invokeNextPipe(ServletPipe.java:118)
at com.google.servlet.pipe.PendingRequestPipe.invoke(PendingRequestPipe.java:31)
at com.google.servlet.pipe.ServletPipe.invokeNextPipe(ServletPipe.java:118)
at com.google.servlet.pipe.HttpRedirectPipe.invoke(HttpRedirectPipe.java:43)
at com.google.servlet.pipe.ServletPipe.invokeNextPipe(ServletPipe.java:118)
at com.google.blogger.frontend.IdentityCookiePipe.invoke(IdentityCookiePipe.java:137)
at com.google.servlet.pipe.ServletPipe.invokeNextPipe(ServletPipe.java:118)
at com.google.servlet.exceptionhandling.ExceptionHandlerPipe.invoke(ExceptionHandlerPipe.java:99)
at com.google.servlet.pipe.ServletPipe.invokeNextPipe(ServletPipe.java:118)
at com.google.servlet.pipe.LocaleContextPipe.invoke(LocaleContextPipe.java:116)
at com.google.servlet.BaseServlet.doGet(BaseServlet.java:89)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:432)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:356)
at com.google.blogger.frontend.ProfileRedirectServlet.doGet(ProfileRedirectServlet.java:40)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:261)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:360)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:604)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:562)
at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:679)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:619)
at java.lang.Thread.run(Thread.java:534)
Caused by: java.sql.SQLException: [JTurbo 3.0.2 JDBC 2.1 Driver]: Communication Link Failure. Connection refused
at com.newatlanta.jturbo.driver.DataSource.getConnection(DataSource.java)
at com.newatlanta.jturbo.driver.DataSource.getConnection(DataSource.java)
at com.newatlanta.jturbo.driver.PoolManagerDataSource.b(PoolManagerDataSource.java)
at com.newatlanta.jturbo.driver.PoolManagerDataSource.a(PoolManagerDataSource.java)
at com.newatlanta.jturbo.driver.PoolManagerDataSource.getPooledConnection(PoolManagerDataSource.java)
at com.newatlanta.jturbo.driver.PoolManagerDataSource.getPooledConnection(PoolManagerDataSource.java)
at com.google.blogger.dbreader.SqlServer.getConnection(SqlServer.java:259)
at com.google.blogger.dbreader.SqlServer.query(SqlServer.java:1626)
... 62 more
(all that for a down(ed) database!)
not that it’s a terrible big deal, but there’s so much proprietary software information exposed when you let your exceptions hang out like that. i know some companies are kinda weird about not wanting the public to know that they use such and such software package.
DEVELOPERS/DESIGNERS OF HIGHLY VISIBLE APPS–handle (or plan to) your software exceptions gracefully. if you’re a designing a system from scratch, i’d take a look at a global error handling mechanism. at the very least, Blue Martini has its own top-level exception that *all* exceptions are eventually bubbled up to, and “the architecture” knows to take a BMException (as it’s called) and show a page that you’ve configured.
i just think it’s silly that some site like Blogger would not have something like this in place.