2012-03-07 50 views
4

我想知道如果我想要捕捉一个错误,我总是必须使用try-catch-error块来混乱代码。对于异常,总是尝试抓住最后?中央错误管理?

或者我可以以某种方式定义一个全局错误捕获器? 特别是关于Java EE Webapps。

对于每个未处理的前端,我想登录到特定文件,并向用户显示一般错误页面。

我想我可能会在某些方面做到这一点。但对于@AfterThrowing的方面,我也必须引入try-catch块。由于没有中央班级的后门面,所以我不得不围绕每个后备方法与trycatches。 然后,这方面将采取他们,但我需要的东西赶上没有明确的抛出异常。

我怎么能这样呢?

回答

3

您在寻找declare soft的结构。这会将给定的异常包装在SoftException(AspectJ特定的RuntimeException)中,以便它不需要明确处理。然后,您可以通过一些AfterThrowing建议来处理所有这些例外情况。

declare soft只存在于代码样式AspectJ中(即没有注释)。所以,你需要使用AspectJ编译器编译你的代码,但是如果你愿意的话,你仍然可以使用加载时编织。

在这里看到: http://www.eclipse.org/aspectj/doc/released/progguide/quick-other.html

在这里: http://www.eclipse.org/aspectj/doc/released/adk15notebook/declare-soft.html


编辑

这里有一个代码片段展示了如何可以做到:

aspect ErrorHandler { 
    declare soft : Exception : within(*); 
    after() throwing(Exception e) : handler(e) { 

    // do something... 
    } 
} 

这无线将通过您的自定义错误处理程序在您的系统中路由全部异常。而且你不需要明确地捕捉或扔掉它们。

它简单而强大。虽然也许太强大了。我建议提炼并更精确地确定哪些例外应该被缓解,哪些应该被告知,但这是基本的想法。

0

对异常情况的更好的控制,调试/提供有意义的消息就越容易。

到什么程度?我会将其与您的应用程序的复杂性/预期寿命相关联。这些越大,越精细,应该是你的处理。

我看到两个主要技术途径:

  • 用户的方法:你得到至少一个异常处理的每个UI动作(这样你就可以说:“不要再次按下该按钮”)。调试器方法:每种方法都有其控制。

请记住,大多数处理可能只是记录重新抛出的异常。

更重要的是,您的Java EE框架很可能在其配置文件(其中许多可与java.util.loggin或log4j一起使用)中具有日志选项。你可以调整它;当然,发送到每个日志类别的内容将取决于框架实现(所以可能不是所有的ERROR消息都是异常)。

1

您不必在每种方法中都这样做。

您不应该捕捉到您无法“处理”的异常。处理意味着不仅仅是重新抛出或记录或打印堆栈跟踪。我认为处理意味着实施有意义的恢复策略。

这可能意味着“降压停在这里”:你是Gandalf在层边界的桥梁上,并且不会有异常通过。您不希望用户看到令人讨厌的消息,因此您可以将它们发送给朋友,轻松理解页面,告诉他们下一步该做什么。

最后并不总是必要的,但它非常适合清理文件句柄和数据库游标等资源。

如果您无法处理异常,那么向方法签名添加throws子句并让调用者找出他们想要执行的操作并不丢脸。

1

在一般情况下,没有机制来做到这一点 - Java没有你要找的东西。

但是,根据您的情况,这可能是可能的。

web.xml异常处理

web.xml文件允许您定义的URL将被用来处理特定类型的异常。 (例如,参见http://wiki.metawerx.net/wiki/Web.xml.ExceptionType)。
由于你正在编写一个web应用程序,你可能只能让异常抛出一切,然后以这种方式处理它们。

自定义拦截

你提到你有后备门面。根据它们的构建方式,您可能会在其前面放置一个通用代理来捕捉和处理您感兴趣的异常。您已用spring标记了您的问题,您可能需要查看Spring AOP代理。

可能有其他的方式来获得你想要的,但它将取决于你的应用程序的体系结构的具体情况。

+0

这个问题不是关于Java,而是关于AspectJ。 – 2012-03-08 19:02:52

+0

@ArewrewEisenberg - 这是关于JEE的webapps,它的标签为'java','spring'和'aspectj'。没有理由不提供纯Java的解决方案。 – Tim 2012-03-09 01:29:23

+0

够正确。我被你的第一行抛弃了,“没有任何机制可以做到这一点”。在纯JEE中,没有,但AspectJ中的解决方案是微不足道的。 – 2012-03-09 04:22:43