J2EE应用程序异常处理框架

本文介绍了一种针对J2EE应用程序的异常处理框架,详细阐述了如何通过使用基类异常、异常处理器和模板方法等手段来实现统一的异常管理和处理。此外,还介绍了如何在Web层处理未检查异常,并提供了具体的实现示例。

J2EE应用程序异常处理框架

1. checked 和 unchecked exceptions
   致命错误, 不可恢复错误, 第三方包错误 包装为unchecked exception。
   业务逻辑异常流,安全异常包装为checked  exception. J2ee应用中有Business exception,

DB exception, security exception, confirmation exception

2. 抛出异常的策略
   2.1 采用J2EE应用程序的 前端控制器(front controller) 集中控制处理,开发者实现具体的

业务逻辑的时候可以不关心异常的捕捉
   2.2 方法签名中throws 一个基类的异常。这样前端控制器中只要捕捉这个基类的异常,开发者

可以定义自己派生的异常具体类

3. 在web层处理unchecked exceptions
   所有的unchecked exceptions 都应该在web层进行处理, 可以在web.xml中配置异常发生时显

示定制的错误页面。

4. 封装第三方包的所有异常(Exception)为一个我们定义的unchecked exception

5. 对来自数据库操作的checked exception, 比如Employee not found, Order not found可以抽

象一个RecordNotFoundException.  至于这个RecordNotFoundException是因为Employee还是Order

引起的作为context, 由context一起组成error code,抛给前端控制器。

6. 前端控制器中的错误处理
   基类的异常处理(应用模板方法设计模式 Template Method)和子类(实现业务)的部分代码如

下,以struts为例

public abstract class BaseAppDispatchAction
  extends DispatchAction{
...
protected static ThreadLocal
  expDisplayDetails = new ThreadLocal();

public ActionForward execute(
  ActionMapping mapping,
  ActionForm form,
  HttpServletRequest request,
  HttpServletResponse response) throws Exception{
    ...
    try{
        String actionMethod = request
           .getParameter(mapping.getParameter());
        finalDestination =dispatchMethod(mapping,
          form, request, response,actionMethod);
    }catch (BaseAppException Ex) {
        ExceptionDisplayDTO expDTO =
           (ExceptionDisplayDTO)expDisplayDetails
               .get();
        IExceptionHandler expHandler =
            ExceptionHandlerFactory
                .getInstance().create();
        ExceptionDTO exDto = expHandler
            .handleException(
                expDTO.getContext(), userId, Ex);
        ActionErrors errors = new ActionErrors();
        errors.add(ActionErrors.GLOBAL_ERROR,
            new ActionError(exDto
                .getMessageCode()));
        saveErrors(request, errors);
        return mapping.findForward(expDTO
            .getActionForwardName());
    } catch(Throwable ex){
           //log the throwable
           //throw ex;
    } finally {
           expDisplayDetails.set(null);
    }

    业务子类中代码如下:
...
String exceptionActionForward =
    "SearchAdjustmentPage";
String exceptionContext =
    "divisionAction.searchDivision";
       
ExceptionDisplayDTO expDTO =
    new ExceptionDisplayDTO(expActionForward,
        exceptionContext);
expDisplayDetails.set(expDTO);
...
DivisionDTO divisionDTO =divisionBusinessDelegate
   .getDivisionByNum(fromDivisionNum);
...

  ExceptionDisplayDTO 作为data transfer object放在ThreadLocal中专门为了父类的异常处理

7.  Exception Handler
    上面的集中异常控制是在Excepiton Handler中处理的,包括:
    根据异常类型获取异常代码,异常代码会用来显示异常信息. 异常类型与异常代码的对应关系

可以放到一个XML文件中.  根据异常代码取异常信息可以由ResouceBundle来实现,这样同时解决了

异常信息国际化的问题. 两个异常配置的xml文件如下:
<exception name="EmployeeConfirmationException">
    <messagecode>messagecode.employeeconfirmation</messagecode>
    <confirmationind>true</confirmationind>
    <loggingtype>nologging</loggingtype>
</exception>
<exception name="RecordNotFoundException">
    <messagecode>messagecode.recordnotfound</messagecode>
    <confirmationind>false</confirmationind>
    <contextind>true</contextind>
    <loggingtype>error</loggingtype>
</exception>
第二个异常文件考虑了我们上面讲的context问题.     如果抛出的异常是

RecordNotFoundException, 并且当前的context是order.getOrder  , 那么error code就

是:messagecode.recordnotfound.order.getOrder

为了避免多次解析这个XML文件,可以实现一个ExceptionInfoCache ,启动应用时缓冲这个xml的内

容.

ExceptionHandler中handleException方法代码片断如下:

public ExceptionDTO handleException(String userId,
      BaseAppException exp) { 
    ExceptionDTO exDTO = new ExceptionDTO();
    ExceptionInfoCache ecache =
        ExceptionInfoCache.getInstance();
    ExceptionInfo exInfo = ecache
      .getExceptionInfo(
        ExceptionHelper.getClassName(exp));
    String loggingType = null;
    if (exInfo != null) {
        loggingType = exInfo.getLoggingType();
        exDTO.setConfirmation(exInfo
            .isConfirmation());
        exDTO.setMessageCode(exInfo
            .getMessageCode());
    }

    FileLogger logger = new FileLoggerFactory()
        .create();
    logger.logException(exp, loggingType);

内容概要:本文围绕“分布式电源接入配电网承载力评估方法”的研究展开,重点复现了一项基于双层鲸鱼优化算法求解的核心学术论文,结合Matlab编程实现,对IEEE 33节点配电网系统进行建模与仿真分析。研究旨在科学评估在大规模分布式电源接入背景下配电网的承载能力,构建了综合考虑系统运行安全性、电能质量、网络损耗及电压稳定性等多重约束条件的优化评估模型,并采用高效的智能优化算法进行求解,有效提升了评估精度与计算效率,为新能源并网规划、电网扩容改造及运行决策提供了可靠的理论依据和技术支撑。该资源不仅提供完整的代码实现,还深入解析算法设计逻辑与模型构建流程,具有较强的科研复现价值和工程参考意义。; 适合人群:具备电力系统分析基础理论知识和Matlab编程能力,从事新能源并网、智能配电网规划、电力系统优化、分布式能源管理等方向的研究生、科研人员及电力行业工程技术人员。; 使用场景及目标:① 学习并掌握分布式电源接入对配电网影响的量化评估方法;② 深入理解双层优化架构与智能算法(如鲸鱼优化算法)在复杂电力系统问题中的应用机制;③ 获取可运行、可调试的Matlab代码资源,用于科研论文复现、课题研究仿真、课程设计或工程项目前期论证。; 阅读建议:此资源以核心论文的技术路线为基础,强调理论与实践相结合。建议读者在阅读过程中结合电力系统潮流计算、约束优化等基础知识,逐步理解模型构建思路,并动手运行与调试所提供的Matlab代码,通过参数调整与结果分析深化对算法性能与工程适用性的认知,从而真正实现从“看懂”到“掌握”的转化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值