java web应用程序中的运行时异常处理

java web应用程序中的运行时异常处理,java,hibernate,tomcat,web-applications,wicket,Java,Hibernate,Tomcat,Web Applications,Wicket,我遇到了一个有趣的目标,这个目标针对使用wicket和hibernate框架编写的现有web应用程序中的异常处理, 假设我们有一个部署在服务器中的web应用程序,有时它会产生运行时异常,问题是如何在不修改所有类(大约80个模型和150个视图)的情况下获取它们的stacktrace并将其保存到db 希望我把一切都说清楚。 提前谢谢 编写一个实用程序,使用StackTraceElement[]提供完整的stacktrace。使用OutputStream的实现将其推送到CLOB对象。(我认为不需要BL

我遇到了一个有趣的目标,这个目标针对使用wicket和hibernate框架编写的现有web应用程序中的异常处理, 假设我们有一个部署在服务器中的web应用程序,有时它会产生运行时异常,问题是如何在不修改所有类(大约80个模型和150个视图)的情况下获取它们的stacktrace并将其保存到db

希望我把一切都说清楚。

提前谢谢

编写一个实用程序,使用StackTraceElement[]提供完整的stacktrace。使用OutputStream的实现将其推送到CLOB对象。(我认为不需要BLOB)

编写一个实用程序,使用StackTraceElement[]为您提供完整的stacktrace。使用OutputStream的实现将其推送到CLOB对象。(我认为不需要BLOB)

Wicket 1.4及更早版本 重写并返回
WebRequestCycle
的自定义子类,该子类重写以为应用程序中的所有
RuntimeException
提供额外的日志记录行为。请注意,任何未捕获的
异常
都将由Wicket包装在
WicketRuntimeException
中(如的异常处理部分所述):

在这里,使用服务/DAO组件将异常消息和stacktrace一起插入数据库。请记住,根据dbms的不同,您可能希望使用CLOB而不是varchar类型(例如,在Oracle中,varchar列不能容纳超过4000字节)

下面是一个(未经测试的)示例:

public class myApplication extends WebApplication { 
    ...
    @Override
    public RequestCycle newRequestCycle(Request request, Response response) {
        return new myRequestCycle(this, (WebRequest) request, (WebResponse) response);
    }
} 

public class myRequestCycle extends WebRequestCycle { 
    ...
    @Override
    protected void logRuntimeException(RuntimeException rex) {
        super.logRuntimeException(rex);
        Writer w = new StringWriter();
        t.printStackTrace(new PrintWriter(w));
        String stackTrace = w.toString();
        someService.logExceptionToDB(rex.getMessage(),stackTrace);
    } 
} 
Wicket 1.5及更高版本 参见Wicket 1.4及更早版本 重写并返回
WebRequestCycle
的自定义子类,该子类重写以为应用程序中的所有
RuntimeException
提供额外的日志记录行为。请注意,任何未捕获的
异常
都将由Wicket包装在
WicketRuntimeException
中(如的异常处理部分所述):

在这里,使用服务/DAO组件将异常消息和stacktrace一起插入数据库。请记住,根据dbms的不同,您可能希望使用CLOB而不是varchar类型(例如,在Oracle中,varchar列不能容纳超过4000字节)

下面是一个(未经测试的)示例:

public class myApplication extends WebApplication { 
    ...
    @Override
    public RequestCycle newRequestCycle(Request request, Response response) {
        return new myRequestCycle(this, (WebRequest) request, (WebResponse) response);
    }
} 

public class myRequestCycle extends WebRequestCycle { 
    ...
    @Override
    protected void logRuntimeException(RuntimeException rex) {
        super.logRuntimeException(rex);
        Writer w = new StringWriter();
        t.printStackTrace(new PrintWriter(w));
        String stackTrace = w.toString();
        someService.logExceptionToDB(rex.getMessage(),stackTrace);
    } 
} 
Wicket 1.5及更高版本
请参见您可以使用
IRequestCycleListener
记录/处理您的异常:

public class MyExceptionReporter extends AbstractRequestCycleListener {

    @Override
    public IRequestHandler onException(RequestCycle cycle, Exception ex) {
        // log exception here
        return null;
        // if you want to also show an error page:
        // return new RenderPageRequestHandler(new PageProvider(new ExceptionPage(ex)));
    }
}
然后在
WebApplication#init
中注册它:

getRequestCycleListeners().add(new MyExceptionReporter());

您可以使用
IRequestCycleListener
记录/处理异常:

public class MyExceptionReporter extends AbstractRequestCycleListener {

    @Override
    public IRequestHandler onException(RequestCycle cycle, Exception ex) {
        // log exception here
        return null;
        // if you want to also show an error page:
        // return new RenderPageRequestHandler(new PageProvider(new ExceptionPage(ex)));
    }
}
然后在
WebApplication#init
中注册它:

getRequestCycleListeners().add(new MyExceptionReporter());

谢谢,但我如何将此实用程序连接到web应用程序?您正在寻找UncaughtExceptionHandler吗?我正在寻找一种方法来处理由web应用程序库生成的所有异常,但我如何将此实用程序连接到web应用程序?是否正在寻找UncaughtExceptionHandler?我正在寻找一种方法来处理web应用程序产生的所有异常确保保存时不会抛出
RuntimeException
是我的建议:)确保保存时不会抛出
RuntimeException
是我的建议:)+1回答不错。不知道这是可能的,我被困在1.3:(@ilya.stmn)我认为在1.4中不可用,请参阅+1漂亮的答案。不知道这是可能的,我被困在1.3:(@ilya.stmn我认为它在1.4中不可用,请参阅是否有任何方法来处理异常,而不仅仅是运行时异常如果我记得正确,Wicket请求上下文中任何未捕获的
异常
都会引发
WicketRuntimeException
。具体请参阅异常处理部分。是否有任何方法要处理异常,而不仅仅是运行时异常如果我没有记错,Wicket请求上下文中任何未捕获的
异常
,最终都会抛出一个
WicketRuntimeException
。具体请参见异常处理部分。